PC上能用xmodmap转换扫描码和虚拟码。但这个
貌似只能转换/dev/ttyx设备的输出。
现在我有一个USB键盘,/dev/input/eventx,读取的值是 struct input_event 结构,测试代码效果与这篇文章相同
http://blog.csdn.net/zgrjkflmkyc/article/details/39499521
但问题是读取的是
“扫描码”,能不能通过什么API接口
ioctl(xxx,xxx)让我读出来的数据直接就是
“虚拟码”甚至是
“ASCII”码。
当然实在要自己写转换函数也能写,只是认为linux上应该有某些机制能帮我完成,
没有必要做无用功。
这里列出三种编码的差异
扫描码 | 虚拟码 | ASCII | 备注 |
30 | A(65) | A(65) | 26个字母的虚拟码仅占用大写字母 |
31 | S(83) | S(83) | |
32 | D(68) | D(68) | |
96 | VK_RETURN | CR(13) | 回车符 |
59 | VK_F1(112) | p(112) | 部分虚拟码可能占用26个小写字母 |
60 | VK_F2(113) | q(113) | |
61 | VK_F3(114) | r(114) | |
29 | VK_LCONTROL(162) | 无输(162) | 左ctrl |
97 | VK_RCONTROL(163) | 无输输(163)
| 右ctrl |
上面的扫描码永远不会更变,就算按下Shift + A,也不会另虚拟码变成小写的a,
我认为扫描码转虚拟码,扫描码转ASCII码应该是2个独立的过程,
就好比微软有获取虚拟码API GetKeyState,
MFC里OnKeyDown得到的是虚拟码
afx_msg void OnKeyDown(
UINT nChar,
UINT nRepCnt,
UINT nFlags
);
MFC里OnChar得到的是ASCII码
afx_msg void OnChar(
UINT nChar,
UINT nRepCnt,
UINT nFlags
);
参考资料:
- MFC头文件 WinUser.h 里对虚拟码的定义 #define VK_RETURN 0x0D
- Linux头文件 include/linux/input.h 里对扫描码的定义 #define KEY_ENTER 28
- 建立扫描码与虚拟码之间的映射对不同地区、国家的好处《Linux 中的键盘映射》http://hessian.cn/p/144.html
本文来自论坛,点击查看完整帖子内容。