2008-10-04 14 views
18

我试图使用的setparent函数嵌入由我处理一个窗口,一个外部进程的窗口,并可能遇到了我希望有人能帮助我的几个问题外部进程用。首先,这里是什么,我目前在做我的窗口嵌入到应用程序中的轮廓:嵌入HWND到使用的setparent

HWND myWindow; //Handle to my application window 
HWND externalWindow; //Handle to external application window 

SetParent(myWindow,externalWindow); 

//Remove WS_POPUP style and add WS_CHILD style 
DWORD style = GetWindowLong(myWindow,GWL_STYLE); 
style = style & ~(WS_POPUP); 
style = style | WS_CHILD; 
SetWindowLong(myWindow,GWL_STYLE,style); 

此代码的工作和我的窗口出现在其他应用程序,但引入了以下问题:

  • 当我的窗口获得输入焦点,外部进程的主要应用程序窗口失去焦点(即标题栏改变颜色)的主要应用
  • 键盘快捷键的命令,而我的窗口具有焦点不起作用

有没有人知道这个解决方法?我希望我的窗口被视为主应用程序的另一个子窗口。

回答

12

那么,我终于找到了我的问题的答案。

要解决主应用程序失去焦点的问题,您需要使用AttachThreadInput函数将嵌入式窗口线程附加到主应用程序线程。

此外,人们可以使用TranslateAccelerator函数响应WM_KEYDOWN消息来确保主应用程序的加速器消息被触发。

0

我使用WM_NACTIVE消息在Catch22.net上找到了一些相关信息。

它位于防止窗口停用部分。 希望有所帮助。

4

我不确定在近三年后您是否仍对这个话题感兴趣。 我正在研究类似的应用程序。我的解决方案是在调用SetParent之前修改窗口样式。有了这个解决方案,我不必调用AttachThreadInput。

但是,从外部进程托管子窗口的一个主要问题是,如果外部进程在响应用户键盘或鼠标输入时挂起,则主应用程序也会冻结。主应用程序中的消息循环仍在运行。但是,它不再接收用户输入事件。因此,它看起来好像挂了。我相信这是AttachThreadInput的直接结果,因为两个threades的输入事件现在是同步的。如果其中一个被阻止,则两者都被阻止。

0

我遇到了同样的问题,仔细阅读MSDN文档后,我发现它很容易修复。

您应该删除WS_POPUP,并添加WS_CHILD 你打电话的setParent

它在MSDN的说明:

出于兼容性考虑,的setparent不修改WS_CHILD或WS_POPUP窗口风格,其父母为窗口正在改变。因此,如果hWndNewParent为NULL,则应在调用SetParent后清除WS_CHILD位并设置WS_POPUP样式。相反,如果hWndNewParent不为NULL,并且窗口以前是桌面的子窗口,则应在清除WS_POPUP样式并在调用SetParent之前设置WS_CHILD样式。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms633541(v=vs.85).aspx