首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用SetParent将HWND嵌入到外部进程

使用SetParent将HWND嵌入到外部进程
EN

Stack Overflow用户
提问于 2008-10-04 18:26:44
回答 3查看 8.9K关注 0票数 17

我正在尝试使用SetParent函数将来自我的进程的窗口嵌入到外部进程的窗口中,并且遇到了一些问题,希望有人能帮助我解决这些问题。首先,这里概述了我目前正在做的将窗口嵌入到应用程序中的工作:

代码语言:javascript
复制
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);

这段代码可以工作,我的窗口会出现在另一个应用程序中,但会引入以下问题:

  • 当我的窗口获得输入焦点时,外部进程的主应用程序窗口将失去焦点(例如,当我的窗口具有焦点

时,标题栏更改主应用程序的快捷方式命令不起作用

有没有人知道解决这个问题的办法?我希望我的窗口被当作是主应用程序的另一个子窗口。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-12-02 22:41:09

好吧,我终于找到了我的问题的答案。

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

此外,还可以在响应WM_KEYDOWN消息时使用TranslateAccelerator函数,以确保主应用的加速器消息被触发。

票数 11
EN

Stack Overflow用户

发布于 2011-08-17 06:15:42

我不确定近三年后你是否还对这个话题感兴趣。我正在开发一个类似的应用程序。我的解决方案是在调用SetParent之前修改窗口样式。使用这个解决方案,我不需要调用AttachThreadInput。

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

票数 4
EN

Stack Overflow用户

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/170800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档