一个C++程序用一个子窗口打开另一个程序怎么做?

时间:2021-06-01 23:50:59
目前我要做一个程序然后再这个程序里面用一个窗口来打开另外一个程序,实现的思路是怎样的?
另外我的子窗口要打开的程序实际上是一个java的程序窗口(就一个),平时启动都是用java命令行启动的,如果要在C++里面以子窗口打开的话我想知道怎么获取窗口句柄,或者说拿到了句柄能不能把这个窗口给弄到那个子窗口上?如果不行,一般的做法应该是怎么做的?
100分送上~

13 个解决方案

#1


你的问题描述的不够明确
是c++的窗口想拉起java的窗口把?   java的程序是b/s还是c/s的?
bs的话,放个chtmlview即可

如果是c/s的话,java的句柄只能拿到虚拟机的外壳句柄,内部拿不到,也没有句柄,可以用spy++试下

1.jni接口映射
2.rpc调用
3.扫描文件,A在数据库,txt中标记,B定时扫描到就做出响应
4.脚本传递,python,js等

#2


5.加com对象,java不知道行不行,反正js,vbs这种脚本都支持的

#3


将窗口子类化,干什么都行

#4


引用 1 楼 u013546033 的回复:
你的问题描述的不够明确
是c++的窗口想拉起java的窗口把?   java的程序是b/s还是c/s的?
bs的话,放个chtmlview即可

如果是c/s的话,java的句柄只能拿到虚拟机的外壳句柄,内部拿不到,也没有句柄,可以用spy++试下

1.jni接口映射
2.rpc调用
3.扫描文件,A在数据库,txt中标记,B定时扫描到就做出响应
4.脚本传递,python,js等


是cs的,外壳句柄怎么拿?难道要遍历所有窗口吗?不能直接获取我命令行调用的吗?
另外那个把这个窗口当作自己的内部窗口应该怎么做?其实我想的就是这个窗口能接受我调用程序的各种事件流。我想的话直接换掉HWND应该不行吧?

#5


引用 3 楼 jha334201553 的回复:
将窗口子类化,干什么都行

求详解

#6


引用 楼主 z175269158 的回复:
C++里面以子窗口打开java程序
你这个是怎么打开的?
这个java代码能不能修改?
引用 楼主 z175269158 的回复:
拿到了句柄能不能把这个窗口给弄到那个子窗口上?
是谁到谁的上面?

找子窗口只要 FindWindow 或者 FindWindowEx 就可以了,窗口移动也只要获取获取大小后 MoveWindow 即可。
不能修改java用子类化,在java的窗口里面写入一个dll即可,直接接管整个消息循环。
用python黏连C跟java也可以

#7


也可以用进程间通信来交互。

#8


引用 6 楼 jha334201553 的回复:
Quote: 引用 楼主 z175269158 的回复:

C++里面以子窗口打开java程序
你这个是怎么打开的?
这个java代码能不能修改?
引用 楼主 z175269158 的回复:
拿到了句柄能不能把这个窗口给弄到那个子窗口上?
是谁到谁的上面?

找子窗口只要 FindWindow 或者 FindWindowEx 就可以了,窗口移动也只要获取获取大小后 MoveWindow 即可。
不能修改java用子类化,在java的窗口里面写入一个dll即可,直接接管整个消息循环。
用python黏连C跟java也可以


是java的窗口变成我的子窗口能接受我的事件流,但是java那边我丝毫不能动。

#9


引用 7 楼 zmlovelx 的回复:
也可以用进程间通信来交互。


java那边我不能做任何变更

#10


Windows的窗口句柄都是全局的。你的程序里可以拿另外一个程序的窗口当自己的用。

你可以通过SetWindowLong系列API修改窗口样式,去掉它的WS_POPUP,为它加上WS_CHILD等等,将它修改成适合作为子窗口的新窗口。然后通过SetParent(可能不叫这名,但绝对有这样一个修改窗口父窗口的API)把目标窗口的父窗口改成你的窗口。

不过有很多消息是只有父窗口有的,由父窗口分发给子窗口,这些消息你也需要把它分发下去。至少包括WM_NOTIFY、WM_COMMAND系列消息,但不只这些,还有一些别的消息也需要处理。

#11


引用 10 楼 lyramilk 的回复:
Windows的窗口句柄都是全局的。你的程序里可以拿另外一个程序的窗口当自己的用。

你可以通过SetWindowLong系列API修改窗口样式,去掉它的WS_POPUP,为它加上WS_CHILD等等,将它修改成适合作为子窗口的新窗口。然后通过SetParent(可能不叫这名,但绝对有这样一个修改窗口父窗口的API)把目标窗口的父窗口改成你的窗口。

不过有很多消息是只有父窗口有的,由父窗口分发给子窗口,这些消息你也需要把它分发下去。至少包括WM_NOTIFY、WM_COMMAND系列消息,但不只这些,还有一些别的消息也需要处理。

“适合作为子窗口的新窗口”有误,不是新窗口,是新配置的旧窗口。

#12


引用 10 楼 lyramilk 的回复:
Windows的窗口句柄都是全局的。你的程序里可以拿另外一个程序的窗口当自己的用。

你可以通过SetWindowLong系列API修改窗口样式,去掉它的WS_POPUP,为它加上WS_CHILD等等,将它修改成适合作为子窗口的新窗口。然后通过SetParent(可能不叫这名,但绝对有这样一个修改窗口父窗口的API)把目标窗口的父窗口改成你的窗口。

不过有很多消息是只有父窗口有的,由父窗口分发给子窗口,这些消息你也需要把它分发下去。至少包括WM_NOTIFY、WM_COMMAND系列消息,但不只这些,还有一些别的消息也需要处理。


感觉很靠谱,我试试看,多谢!

#13


引用 4 楼 z175269158 的回复:
Quote: 引用 1 楼 u013546033 的回复:

你的问题描述的不够明确
是c++的窗口想拉起java的窗口把?   java的程序是b/s还是c/s的?
bs的话,放个chtmlview即可

如果是c/s的话,java的句柄只能拿到虚拟机的外壳句柄,内部拿不到,也没有句柄,可以用spy++试下

1.jni接口映射
2.rpc调用
3.扫描文件,A在数据库,txt中标记,B定时扫描到就做出响应
4.脚本传递,python,js等


是cs的,外壳句柄怎么拿?难道要遍历所有窗口吗?不能直接获取我命令行调用的吗?
另外那个把这个窗口当作自己的内部窗口应该怎么做?其实我想的就是这个窗口能接受我调用程序的各种事件流。我想的话直接换掉HWND应该不行吧?


用rpc远程过程调用吧,这样什么都解决了

#1


你的问题描述的不够明确
是c++的窗口想拉起java的窗口把?   java的程序是b/s还是c/s的?
bs的话,放个chtmlview即可

如果是c/s的话,java的句柄只能拿到虚拟机的外壳句柄,内部拿不到,也没有句柄,可以用spy++试下

1.jni接口映射
2.rpc调用
3.扫描文件,A在数据库,txt中标记,B定时扫描到就做出响应
4.脚本传递,python,js等

#2


5.加com对象,java不知道行不行,反正js,vbs这种脚本都支持的

#3


将窗口子类化,干什么都行

#4


引用 1 楼 u013546033 的回复:
你的问题描述的不够明确
是c++的窗口想拉起java的窗口把?   java的程序是b/s还是c/s的?
bs的话,放个chtmlview即可

如果是c/s的话,java的句柄只能拿到虚拟机的外壳句柄,内部拿不到,也没有句柄,可以用spy++试下

1.jni接口映射
2.rpc调用
3.扫描文件,A在数据库,txt中标记,B定时扫描到就做出响应
4.脚本传递,python,js等


是cs的,外壳句柄怎么拿?难道要遍历所有窗口吗?不能直接获取我命令行调用的吗?
另外那个把这个窗口当作自己的内部窗口应该怎么做?其实我想的就是这个窗口能接受我调用程序的各种事件流。我想的话直接换掉HWND应该不行吧?

#5


引用 3 楼 jha334201553 的回复:
将窗口子类化,干什么都行

求详解

#6


引用 楼主 z175269158 的回复:
C++里面以子窗口打开java程序
你这个是怎么打开的?
这个java代码能不能修改?
引用 楼主 z175269158 的回复:
拿到了句柄能不能把这个窗口给弄到那个子窗口上?
是谁到谁的上面?

找子窗口只要 FindWindow 或者 FindWindowEx 就可以了,窗口移动也只要获取获取大小后 MoveWindow 即可。
不能修改java用子类化,在java的窗口里面写入一个dll即可,直接接管整个消息循环。
用python黏连C跟java也可以

#7


也可以用进程间通信来交互。

#8


引用 6 楼 jha334201553 的回复:
Quote: 引用 楼主 z175269158 的回复:

C++里面以子窗口打开java程序
你这个是怎么打开的?
这个java代码能不能修改?
引用 楼主 z175269158 的回复:
拿到了句柄能不能把这个窗口给弄到那个子窗口上?
是谁到谁的上面?

找子窗口只要 FindWindow 或者 FindWindowEx 就可以了,窗口移动也只要获取获取大小后 MoveWindow 即可。
不能修改java用子类化,在java的窗口里面写入一个dll即可,直接接管整个消息循环。
用python黏连C跟java也可以


是java的窗口变成我的子窗口能接受我的事件流,但是java那边我丝毫不能动。

#9


引用 7 楼 zmlovelx 的回复:
也可以用进程间通信来交互。


java那边我不能做任何变更

#10


Windows的窗口句柄都是全局的。你的程序里可以拿另外一个程序的窗口当自己的用。

你可以通过SetWindowLong系列API修改窗口样式,去掉它的WS_POPUP,为它加上WS_CHILD等等,将它修改成适合作为子窗口的新窗口。然后通过SetParent(可能不叫这名,但绝对有这样一个修改窗口父窗口的API)把目标窗口的父窗口改成你的窗口。

不过有很多消息是只有父窗口有的,由父窗口分发给子窗口,这些消息你也需要把它分发下去。至少包括WM_NOTIFY、WM_COMMAND系列消息,但不只这些,还有一些别的消息也需要处理。

#11


引用 10 楼 lyramilk 的回复:
Windows的窗口句柄都是全局的。你的程序里可以拿另外一个程序的窗口当自己的用。

你可以通过SetWindowLong系列API修改窗口样式,去掉它的WS_POPUP,为它加上WS_CHILD等等,将它修改成适合作为子窗口的新窗口。然后通过SetParent(可能不叫这名,但绝对有这样一个修改窗口父窗口的API)把目标窗口的父窗口改成你的窗口。

不过有很多消息是只有父窗口有的,由父窗口分发给子窗口,这些消息你也需要把它分发下去。至少包括WM_NOTIFY、WM_COMMAND系列消息,但不只这些,还有一些别的消息也需要处理。

“适合作为子窗口的新窗口”有误,不是新窗口,是新配置的旧窗口。

#12


引用 10 楼 lyramilk 的回复:
Windows的窗口句柄都是全局的。你的程序里可以拿另外一个程序的窗口当自己的用。

你可以通过SetWindowLong系列API修改窗口样式,去掉它的WS_POPUP,为它加上WS_CHILD等等,将它修改成适合作为子窗口的新窗口。然后通过SetParent(可能不叫这名,但绝对有这样一个修改窗口父窗口的API)把目标窗口的父窗口改成你的窗口。

不过有很多消息是只有父窗口有的,由父窗口分发给子窗口,这些消息你也需要把它分发下去。至少包括WM_NOTIFY、WM_COMMAND系列消息,但不只这些,还有一些别的消息也需要处理。


感觉很靠谱,我试试看,多谢!

#13


引用 4 楼 z175269158 的回复:
Quote: 引用 1 楼 u013546033 的回复:

你的问题描述的不够明确
是c++的窗口想拉起java的窗口把?   java的程序是b/s还是c/s的?
bs的话,放个chtmlview即可

如果是c/s的话,java的句柄只能拿到虚拟机的外壳句柄,内部拿不到,也没有句柄,可以用spy++试下

1.jni接口映射
2.rpc调用
3.扫描文件,A在数据库,txt中标记,B定时扫描到就做出响应
4.脚本传递,python,js等


是cs的,外壳句柄怎么拿?难道要遍历所有窗口吗?不能直接获取我命令行调用的吗?
另外那个把这个窗口当作自己的内部窗口应该怎么做?其实我想的就是这个窗口能接受我调用程序的各种事件流。我想的话直接换掉HWND应该不行吧?


用rpc远程过程调用吧,这样什么都解决了