以IE的子窗口为父,在另外线程创建子窗口的问题。。

j8daxue j8daxue 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
新建一个ATL工程建一个activex控件,在网页中用js调用其函数:
功能大体是:以IOleClientSite接口取得这个控件的父窗口P,创建线程B,B里建一个P的子窗口C并有自己的消息循环。

现在C可能在窗口处理函数里调MessageBox(NULL,...),弹出了如果先不关闭,激活其他窗口再回来关闭,窗口C就再也收不到输入法相关消息(WM_IME_SETCONTEXT,.ect).除非再弹后保证关闭MsgBox前激活的窗口是C,才回复正常。

经SPY++观察发现正常情况下,MsgBox弹出时C收到WM_IME_SETCONTEXT,fSet = 0,关闭收到同样消息,fSet = 1. 如果关闭前激活的是其他窗口,后者将收不到,且以后IME相关的消息再也收不到了,即使在WM_SETFOCUS时主动发一个WM_IME_SETCONTEXT也无法恢复。具体表现为CTRL + SPACE单单产生KEYDOWN,UP消息,中间没有IME消息(正常是有的)

以上情况如果C建立在和P同一个线程就不会有问题,即便激活其他窗口后关闭MSGBOX收不到WM_IME_SETCONTEXT,但点击窗口C时会收到WM_IME_SETCONTEXT,一切又正常;不在同一线程时,如果没出现上面操作,C有焦点,点击时会收到WM_IME_SETCONTEXT,但调用栈和同一线程时不同。一旦有这些操作后就都不行了。

创建线程B的原因是C的窗口过程处理非常多的东西,且是个写好的dll。
放同一线程的方案试过,但绕的更多了。。。。

有人遇到过这种问题么,做那些操作后windows为什么就不通知窗口C相关的IME消息了。估计是因为窗口没满足什么条件。。。?

...全文
评论 8
收藏 已收藏
分享
返回顶部
j8daxue
VC/MFC 16,550 成员 421,606 内容