这是最近弄的一个程序,其实以前在使用别的程序的时候貌似也出现过类似的问题,那就是:有些时候点击菜单栏上的输入法按钮,输入法面板却无法正常隐藏。而经过进一步研究后发现,其实并不是没有隐藏,而是没有刷新,而且不能通过常规的手段来刷新,比如调用InvalidateRect,或者“遮挡/重新调出”等常规手段。如图:
![](http://www.cppblog.com/images/cppblog_com/guogangj/wm_input_panel_problem_1.png)
仔细看菜单栏上的“S”按钮,这是搜狗输入法的按钮,现在它应该处于关闭状态,而输入法面板却还在显示,并且,点上去无效,效果是“点击穿透”,下面这张图是输入法面板正常的情况:
![](http://www.cppblog.com/images/cppblog_com/guogangj/wm_input_panel_problem_2.png)
这是菜单栏上的输入法按钮处于激活状态。
当出现问题的时候,你让企图通过“遮挡/重新调出”的手段让这块区域重绘,那会导致类似下面的情况,下面这张图就是我呼出开始菜单,然后又关闭开始菜单之后,得到的结果。
![](http://www.cppblog.com/images/cppblog_com/guogangj/wm_input_panel_problem_3.png)
事实上,我的应用程序窗口确实是填满了整个客户区的,至于为什么不能正常刷新,真是令人费解。但经过大量折腾,我看起来是解决了这个问题,那就是把我窗口处理函数中的代码拿掉一点:
case WM_ACTIVATE:
SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE);
break;
// case WM_SETTINGCHANGE:
// SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai);
// break;
下面注释掉的代码就是我拿掉的代码,似乎这个问题就不再出现了,但为什么这样我还是不懂。而Windows Mobile开发中遇到的这种问题真是数不胜数……