如何控制另一个进程的MainFrame主窗口?

BlueEngine 2013-09-02 11:55:52
现有一个MDI的程序a和另一个SDI的程序b,如何实现将a启动b并且将b的主窗口一直限制在a的MDIChild子窗口客户区且调整a的子窗口大小时仍然能保持b的更新?
...全文
633 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zpc38368330 2013-09-15
  • 打赏
  • 举报
回复
哎,是SetWindowPos.... 糗大了。。。笔记本昨天刚拿回来,今天突然想起来楼主的帖子,看了看代码。。。 SetWindowPos(g_hWnd1,HWND_TOP,r.left+x,0,0,0,SWP_NOSIZE);
zhangyihu321 2013-09-10
  • 打赏
  • 举报
回复
SetWindowPos
BlueEngine 2013-09-09
  • 打赏
  • 举报
回复
类似WM_COPYDATA的机制,需要对进程b进行更改,而这正是我力图避免的。
傻X 2013-09-09
  • 打赏
  • 举报
回复
引用 6 楼 BlueEngine 的回复:
这个不行。 因为SendMessage()虽然可以在进程间发送自定义消息(需事先注册),但却不能在进程间发送windows标准消息如WM_MOVE等,见:怎么用SendMessage在两个进程间发消息 http://bbs.csdn.net/topics/312947 如果采用自定义消息的话,那么我就必须改造进程b,而这点不符合我的预期,我把b当成一个黑盒,不能对它进行改变。
进程间用WM_COPYDATA消息,其实也是可以的
zpc38368330 2013-09-06
  • 打赏
  • 举报
回复
我那个程序是用的SPy 方式找的句柄,有个API可以通过句柄得到窗口的标题,你看看你得的这个句柄能对上标题吗
BlueEngine 2013-09-06
  • 打赏
  • 举报
回复
if (ShellExecuteEx(&shExecInfo)) { DWORD id = GetProcessId(shExecInfo.hProcess); if (!id) { } Sleep(1000 * 10); HWND hWnd = GetProcessMainWnd(id); if (hWnd) { ::MoveWindow(hWnd, 0, 0, 500, 500); } } else { } movewindow()不起作用.
BlueEngine 2013-09-06
  • 打赏
  • 举报
回复
问题在于这个movewindow(b)不起作用。
zpc38368330 2013-09-06
  • 打赏
  • 举报
回复
建一个空的子窗口,得到子窗口的位置,计算出B窗口应在的位置,movewindow(b),不是这样的吗? 或者说还缺个让窗口置前的API?让A和B看起来更像一个程序。楼主的疑惑是在哪里?或许是我理解错了吧
BlueEngine 2013-09-06
  • 打赏
  • 举报
回复
可以的,可以确定窗口句柄没有问题。
BlueEngine 2013-09-05
  • 打赏
  • 举报
回复
找到b进程主窗口已经解决。 在a进程内计算b应该出现的位置也没问题; 现在有问题的是把b移动到上述位置,movewindow()已经试验结果不行,SendMessage()又不能奏效,除非是自定义消息,但自定义消息就得修改b,这又不是本意。
BlueEngine 2013-09-04
  • 打赏
  • 举报
回复
句柄没问题。 能大概说下你的程序的结构吗?
zpc38368330 2013-09-04
  • 打赏
  • 举报
回复
movewindow不该不好用啊,我以前做过类似的程序,用的应该是movewindow,你看看参数里的hwnd是正确的框架窗口句柄吗
BlueEngine 2013-09-04
  • 打赏
  • 举报
回复
这个不行。 因为SendMessage()虽然可以在进程间发送自定义消息(需事先注册),但却不能在进程间发送windows标准消息如WM_MOVE等,见:怎么用SendMessage在两个进程间发消息 http://bbs.csdn.net/topics/312947 如果采用自定义消息的话,那么我就必须改造进程b,而这点不符合我的预期,我把b当成一个黑盒,不能对它进行改变。
zpc38368330 2013-09-04
  • 打赏
  • 举报
回复
找b窗口的句柄有很多种办法,用标题找,或通过鼠标位置找,这个百度下,直接复制代码改改就可以。 你在a的程序内响应主框架的WM_MOVE消息,并检测A窗口的位置,然后计算出B窗口应在的位置,然后movewindow试试 忘记C 是不是有MOVEING和MOVED这两个消息了,这俩消息一个是正在移动,一个是移动完成,如果有的话,你的程序响应正在移动的消息效果比较好
zpc38368330 2013-09-03
  • 打赏
  • 举报
回复
SendMessage 参数1:hWnd-窗口句柄。窗口可以是任何类型的屏幕对象。   参数2:wMsg-用于区别其他消息的常量值.   参数3:wParam-通常是一个与消息有关的常量值,也可能是窗口或控件的句柄.   参数4: lParam-通常是一个指向内存中数据的指针。 wMsg参数: #DeFine WM_MOVE 0x03   移动一个窗口   #DeFine WM_SIZE 0x05   改变一个窗口的大小   #DeFine WM_ACTIVATE 0x06   一个窗口被激活或失去激活状态   #DeFine WM_SETFOCUS 0x07 不知道这个可以吗?
Eleven 2013-09-02
  • 打赏
  • 举报
回复
SetParent() ??
赵4老师 2013-09-02
  • 打赏
  • 举报
回复
全局消息钩子?
BlueEngine 2013-09-02
  • 打赏
  • 举报
回复
已知:MoveWindow()不灵。
BlueEngine 2013-09-02
  • 打赏
  • 举报
回复
请for一个example,伪码即可。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧