虚拟键盘的输入和钩子的一点学习
当A程序在后台运行,B程序是当前的焦点时。如何触发A程序的按钮,向B程序写数据?
一个很简单的方法就是用钩子
这个在msdn上面也是有的,需要的时候可以到上面去查看。
g_hKeyBoard = SetWindowsHookEx( WH_KEYBOARD_LL
,KeyBoardProc, GetModuleHandle(NULL), 0 );
这里我是勾取键盘的消息。
LRESULT CALLBACK CAutoUHFDemoDlg::KeyBoardProc( int nCode, WPARAM wParam, LPARAM lParam ) { if (nCode >= 0) { PKBDLLHOOKSTRUCT pmll = (PKBDLLHOOKSTRUCT) lParam; if (pmll->vkCode == 131) { static int iCount = 0; ++iCount; if (iCount == 2) { pDemoDlg->OnInvOnceBtnClick(); iCount = 0; } return 0; } } return CallNextHookEx(g_hKeyBoard, nCode, wParam, lParam); }
这里是我的回调函数,钩子勾取的是键盘的KeyDown 和 KeyUp 所以在进行处理的时候,我用了iCount进行计数,否则会出现一个按键调用两次的情景。
在析构的时候必须要记得:UnhookWindowsHookEx(g_hKeyBoard);
接下来要记录的是关于虚拟键盘的发送问题,因为虚拟键盘发送的消息只是当前焦点所在位置。
又因为咱们键盘没有大写字母,所以在进行写大写字母的时候要添加shift键进行发送
BYTE bKey = 'X';
keybd_event(VK_SHIFT, 0, KEYEVENTF_SILENT, 0);
keybd_event(bKey, 0, KEYEVENTF_SILENT, 0);
keybd_event(bKey, 0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_SILENT | KEYEVENTF_KEYUP, 0);
在这里如果没有添加shift键,即使我这里bKey是大写的X,发送过去的还是小写的x。
这里还有一个问题是第三个参数的KEYEVENTF_SILENT问题,这个我也不懂为什么,只是如果不加这个的话,bKey是X,然而发送过去的却不是这个字母(求懂的人给点解释)
咱们键盘都要有keydown和keyup,所以在虚拟键盘发送一个字符的时候需要成对的使用。在没有定义KEYEVENTF_KEYUP时就默认有keydown了。