MFC程序一切换输入法就卡死

w_xei 2013-01-18 09:58:00
最近编写了一个MFC的SDI程序,使用了多线程、SOCKET、OLEDB等技术,程序运行时只要切换输入法,程序就卡死,不管是用快捷键还是用鼠标选择的方法切换都试过,结果都一样;查看任务管理器CPU占用也是0%,其他程序运行正常,不知是什么原因。
在网上找了好久的资料,有一个好象有点相关:OS在切换输入法时会向线程发一个消息,而自己创建的子线程是没有消息循环的,重载了Run方法等,线程没有窗口,OS发消息给线程就会卡在这里;但为什么OS不发给主窗口消息呢,而且其他多线程程序都没有这个问题,所以怀疑是不是socket有问题,MFC的socket架构好象后台会启动一个线程,但用一个单纯的socket程序测试后不会出现这种情况。
现在不知哪位大侠帮忙指点一下迷津,本人十分感谢
...全文
503 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyoucan 2013-01-24
  • 打赏
  • 举报
回复
引用 8 楼 w_xei 的回复:
经过在网上找资料,线程创建一个窗口后,系统会自动创建一个Default IME窗口以便通知输入法消息,XP下切换输入法,会向所有DefaultIME窗口SendMessage告诉应用程序,当前输入法改变了 而线程窗口如果没有消息循环,则不会处理消息队列,然后卡死 采用以下方法彻底处理好: const TCHAR sClassName[] = _T("IME"); ……
这段代码放在哪呀?
w_xei 2013-01-21
  • 打赏
  • 举报
回复
经过在网上找资料,线程创建一个窗口后,系统会自动创建一个Default IME窗口以便通知输入法消息,XP下切换输入法,会向所有DefaultIME窗口SendMessage告诉应用程序,当前输入法改变了 而线程窗口如果没有消息循环,则不会处理消息队列,然后卡死 采用以下方法彻底处理好: const TCHAR sClassName[] = _T("IME"); const TCHAR sWindowText[] = _T("Default IME"); HWND hImeWnd01 = FindWindow(sClassName, sWindowText); HWND hImeWnd02 = NULL; DWORD dwProcessID = 0, dwCurrentThreadID = GetCurrentThreadId(); while (IsWindow(hImeWnd01)) { if (dwCurrentThreadID == GetWindowThreadProcessId(hImeWnd01, &dwProcessID)) { hImeWnd02 = hImeWnd01; } else { hImeWnd02 = NULL; } if (hImeWnd02!=NULL) { DestroyWindow(hImeWnd02); } hImeWnd01 = FindWindowEx(NULL, hImeWnd01, sClassName, sWindowText); } 在此感谢伟大的网络,顺便说一下,度娘的技术类搜索不太靠谱,技术类还是推荐google。
w_xei 2013-01-21
  • 打赏
  • 举报
回复
把主线程以外的Default IME窗口都DestroyWindow掉 怎么样获取这些窗口的句柄?
西山小月 2013-01-20
  • 打赏
  • 举报
回复
换另外一台机器试一下,先排除是环境问题。
w_xei 2013-01-20
  • 打赏
  • 举报
回复
换不了环境啊,因为这个程序与硬件相关,需要操作大量的硬件PCI板卡
西山小月 2013-01-20
  • 打赏
  • 举报
回复
这算windows的bug吗
stjay 2013-01-20
  • 打赏
  • 举报
回复
以前遇到过,没详细研究过,反正是没有消息循环的线程不要直接使用CSocket和ADO之类的东西, 它们会创建一个隐藏的窗口,附带会创建一个标题为Default IME的窗口(用来接收输入法消息的) 输入法切换时,应该是处于Focus的窗口对应的线程(一般是主线程)发出消息到程序里所有Default IME窗口,通知输入法已改变,如果该消息没处理,会造成SendMessage塞死,会卡死SendMessage的线程(一般是主线程)。 貌似win7改用了SendMessageTimeout,不会再造成卡死 解决方法是,把主线程以外的Default IME窗口都DestroyWindow掉 或者用SendMessage到主界面,让主线程创建,通过SendMessage把其指针传递过来
w_xei 2013-01-19
  • 打赏
  • 举报
回复
和输入法是没有关系,换成微软的输入法都不行,感觉应该是OS向进程中的线程发切换输入法的窗口消息没有处理的问题,但怎么会向进程主线程发窗口消息就不明白,想装一个SPY在用户机器上跟踪一下
西山小月 2013-01-18
  • 打赏
  • 举报
回复
你用的什么输入法?换个输入法试试。另外能否在程序里设个断点试试。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧