(win32)解决虚拟按键被输入法截获
2016-05-15 17:11
711 查看
响应WM_KEYDOWN消息时发现`~快捷键无效,设置断点发现得到的按键消息根本不是VK_OEM_3 192。由于我观察到输入法是打开的,于是关闭输入法后再试,成功了。继续观察发现,开启输入法时,按下的可能被输入法截获的键全都变成了VK_PROCESSKEY 229。
可能被截获的键应该包括标点符号(因为有中英文标点之分)、A~Z字母(打字)等等,而方向键、Ctrl\Alt键等则不会被截获,能被正确识别。
搜索相关资料,有两种解决办法。第一种是在程序开始运行时关闭输入法,用ImmDisableIME(0)这个函数,具体使用请查阅msdn;第二种解决办法是在PreTranslateMessage中对键码还原。
// CMainFrame 消息处理程序
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->wParam == VK_PROCESSKEY)
{
pMsg->wParam = ImmGetVirtualKey(pMsg->hwnd);
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
使用时记得在MainFrame.cpp中添加
#include "imm.h"
#pragma comment(lib, "imm32.lib")
引用:http://bbs.csdn.net/topics/340266774
MSDN:ImmGetVirtualKey
可能被截获的键应该包括标点符号(因为有中英文标点之分)、A~Z字母(打字)等等,而方向键、Ctrl\Alt键等则不会被截获,能被正确识别。
搜索相关资料,有两种解决办法。第一种是在程序开始运行时关闭输入法,用ImmDisableIME(0)这个函数,具体使用请查阅msdn;第二种解决办法是在PreTranslateMessage中对键码还原。
// CMainFrame 消息处理程序
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->wParam == VK_PROCESSKEY)
{
pMsg->wParam = ImmGetVirtualKey(pMsg->hwnd);
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
使用时记得在MainFrame.cpp中添加
#include "imm.h"
#pragma comment(lib, "imm32.lib")
引用:http://bbs.csdn.net/topics/340266774
MSDN:ImmGetVirtualKey
相关文章推荐
- Android Manifest 用法
- 什么是 GraphQL?
- Spark RDD API详解(一) Map和Reduce
- 如何重装TCP/IP协议
- Spring Boot 开发微服务
- Windows 8 官方高清壁纸欣赏与下载
- 谁是桌面王者?Win PK Linux三大镇山之宝
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows Clang开发环境备忘
- 从Windows系统下访问Linux分区相关软件
- 对《大家都在点赞 Windows Terminal,我决定给你泼一盆冷水》一文的商榷
- Windows下搭建本地SVN服务器
- lwn拾遗:[sn3218 led drivers]-api解释-1
- 使用Windows原生命令一键清空剪贴板
- 页面元素查找之Selectors API
- 利用开源软件打造自己的全功能远程工具
- Windows 8虚拟机不能全屏的解决方法