我正在尝试使用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);
这段代码可以工作,我的窗口会出现在另一个应用程序中,但会引入以下问题:
时,标题栏更改主应用程序的快捷方式命令不起作用
有没有人知道解决这个问题的办法?我希望我的窗口被当作是主应用程序的另一个子窗口。
发布于 2008-12-02 22:41:09
好吧,我终于找到了我的问题的答案。
要修复主应用程序失去焦点的问题,您需要使用AttachThreadInput函数将嵌入式窗口线程附加到主应用程序线程。
此外,还可以在响应WM_KEYDOWN消息时使用TranslateAccelerator函数,以确保主应用的加速器消息被触发。
发布于 2011-08-17 06:15:42
我不确定近三年后你是否还对这个话题感兴趣。我正在开发一个类似的应用程序。我的解决方案是在调用SetParent之前修改窗口样式。使用这个解决方案,我不需要调用AttachThreadInput。
但是,宿主来自外部进程的子窗口的一个主要问题是,如果外部进程在响应用户键盘或鼠标输入时挂起,则主应用程序也会冻结。主应用程序中的消息循环仍在运行。但是,它不再接收用户输入事件。因此,它看起来就像是挂着的。我相信这是AttachThreadInput的直接结果,因为两个线程的输入事件现在是同步的。如果其中一个被阻止,则两个都被阻止。
发布于 2017-07-06 21:52:11
我遇到了同样的问题,在仔细阅读了MSDN文档后,我发现它很容易解决。
您应该在调用setParent之前删除WS_POPUP并添加WS_CHILD
这是在MSDN中声明的:
出于兼容性原因,SetParent不会修改其父窗口正在更改的窗口的WS_CHILD或WS_POPUP窗口样式。因此,如果hWndNewParent为NULL,则还应在调用SetParent后清除WS_CHILD位并设置WS_POPUP样式。相反,如果hWndNewParent不是NULL,并且该窗口以前是桌面的子级,则应在调用SetParent.之前清除WS_POPUP样式并设置WS_CHILD样式
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633541(v=vs.85).aspx
https://stackoverflow.com/questions/170800
复制相似问题