以IE的子窗口为父,在另外线程创建子窗口的问题。。
新建一个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消息了。估计是因为窗口没满足什么条件。。。?