以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消息了。估计是因为窗口没满足什么条件。。。?
功能大体是:以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消息了。估计是因为窗口没满足什么条件。。。?
...全文
相关推荐
window.parent调用父框架时 ie跟火狐不兼容问题
window.parent调用父框架时,ie跟火狐不兼容问题!
IE关闭主窗口时,同时关闭所有的子窗口
NULL 博文链接:https://rainbow702.iteye.com/blog/1221171
Checkbox父选项控制子选项,子选项控制父选项.docx
Checkbox父选项控制子选项,子选项控制父选项.docx
类IE7的标签窗口控件,直接将MDI窗口的子窗口按照标签页方式显示
类IE7的标签窗口控件,直接将MDI窗口的子窗口按照标签页方式显示,源代码是VB的,控件运行稳定,美观。
Chrome中链接打开IE窗口插件
谷歌,火狐,360,欧朋等浏览器中通过URL链接打开IE浏览器新窗口,可解决新的高版本的前端框架VUE等,集成公司内老版本的项目问题。希望可以帮助你们!!!


