windows模拟驱动级键盘事件应使用 SendInput 方法, 官方介绍在此:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310%28v=vs.85%29.aspx
使用时需要的头文件和库在上文下部的Requirements中均有说明
模拟按键按下比较简单, 可以使用虚拟键码, 也可以使用扫描码, 就是键盘驱动传递的16进制码, 一般对一些使用windows消息机制的程序(即一般的窗口程序, 文件管理器啥啥的)进行模拟按键使用虚拟键码就可以了, 但是对使用DirectInput 的程序应该使用扫描码, 因为这些程序一般都兼容操作杆方向盘等特殊输入设备, 都使用的是扫描码。
使用SendInput 方法需要注意几个问题
1. 发送扫描码的时候如果有一连串的按键最好不要使用数组进行发送, 而是每个按键调用一次SendInput, 这是因为比如方向键这样的按键其实是多个扫描码表示的, 比如向右的箭头的按下扫描码是 e0 2a e0 4d,如果而左shift按键的扫描码是 2a, 如果你使用数组发送的话就会发现会产生混淆。(具体原因不明, 实践经验, 欢迎交流)
2. 有的时候使用扫描码会出现模拟不成功的情况, 这时请指定 m_INPUT.ki.dwFlags 为KEYEVENTF_SCANCODE, 说明参见:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646271%28v=vs.85%29.aspx
3. SendInput的第三个参数使用 sizeof(INPUT)即可
特别说明一下使用扫描码模拟键盘按键松开的事件:
INPUT input_message; memset(&input_message,0,sizeof(INPUT)); input_message.type = INPUT_KEYBOARD; input_message.ki.wScan = 0x25; // 此键按下时的扫描码, 注意是按下时的 input_message.ki.dwFlags = KEYEVENTF_KEYUP|KEYEVENTF_SCANCODE; SendInput(1, &input_message, sizeof(INPUT)); |
附一个获取键盘事件的小程序, 作者为hejiyu@sohu.com
KEYTEST