虚拟键盘的输入和钩子的一点学习

当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);
}
View Code

这里是我的回调函数,钩子勾取的是键盘的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了。

posted @ 2013-10-10 19:31  CY_K_YC  阅读(386)  评论(0编辑  收藏  举报