(win32)解决虚拟按键被输入法截获(转)

源博客地址:http://blog.csdn.net/kencaber/article/details/51417871

 

响应WM_KEYDOWN消息时发现`~快捷键无效,设置断点发现得到的按键消息根本不是VK_OEM_3 192。由于我观察到输入法是打开的,于是关闭输入法后再试,成功了。继续观察发现,开启输入法时,按下的可能被输入法截获的键全都变成了VK_PROCESSKEY 229。

可能被截获的键应该包括标点符号(因为有中英文标点之分)、A~Z字母(打字)等等,而方向键、Ctrl\Alt键等则不会被截获,能被正确识别。

 

搜索相关资料,有两种解决办法。第一种是在程序开始运行时关闭输入法,用ImmDisableIME(0)这个函数,具体使用请查阅msdn;第二种解决办法是在PreTranslateMessage中对键码还原。

 

[cpp] view plain copy
 
  1. // CMainFrame 消息处理程序  
  2.    
  3. BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)  
  4. {  
  5.     // TODO:  在此添加专用代码和/或调用基类  
  6.     if (pMsg->wParam == VK_PROCESSKEY)  
  7.     {  
  8.         pMsg->wParam = ImmGetVirtualKey(pMsg->hwnd);  
  9.     }  
  10.     return CFrameWnd::PreTranslateMessage(pMsg);  
  11. }  

 

 

使用时记得在MainFrame.cpp中添加

#include "imm.h"
#pragma comment(lib, "imm32.lib")

引用:http://bbs.csdn.net/topics/340266774

MSDN:ImmGetVirtualKey

posted @ 2017-05-25 11:14  公子綦  阅读(1925)  评论(0编辑  收藏  举报