1.    创建钩子
HHOOK hHookKeyBoard=SetWindowsHookEx(WH_KEYBOARD,
                                 KeyboardProc,
                                 NULL,
                                 GetCurrentThreadId());
ASSERT(hHookKeyBoard!=NULL);
 
2.    卸载钩子
if (hHookKeyBoard!=NULL)
{
    UnhookWindowsHookEx(hHookKeyBoard);
}
 
3.    钩子处理过程
LRESULT CALLBACK KeyboardProc(
        int code,
        WPARAM wParam,//virtual-key code
        LPARAM lParam)//keystroke-message information
{
    //此时wParamlParam中包含了击键信息
    if (HC_ACTION==code)
    {
       
        //如果要屏蔽程序继续处理某些按键,则返回TRUE,例如屏蔽ESC
        if (wParam == VK_ESCAPE)
        {
            return TRUE;
        }
       
        //This flag is always set to 0 for WM_KEYDOWN and WM_SYSKEYDOWN messages;
        //it is always set to 1 for WM_KEYUP and WM_SYSKEYUP messages.
        if ( lParam & 0x80000000== 0 ) //lParam & 0x80000000
        {
            //WM_KEYDOWN或者WM_SYSKEYDOWN
 
 
            //Specifies the context code.
            //The value is 1 if the ALT key is down; otherwise, it is 0.
            if ( lParam & 0x20000000 == 0) //lParam & 0x20000000
            {
                //Alt is down
            }
 
            if ( (GetKeyState(VK_MENU) & 0x8000) == 0x8000) // & 0x8000
            {
                //Alt is down
            }
             
            if ( (GetKeyState(VK_CONTROL) & 0x8000) == 0x8000) // & 0x8000
            {
                //Ctrl is down
            }
 
        }
        else
        {
            // WM_KEYUP或者WM_SYSKEYUP
        }
    }
 
    return CallNextHookEx(hHookKeyBoard,code,wParam,lParam);
}

ActiveX控件放在容器中后,一旦控件得到了焦点,会使容器窗体收不到键盘消息,可以通过钩子用如下方法解决:
AfxGetMainWnd()->PostMessage(WM_SYSKEYDOWN/*或者*/WM_KEYDOWN,wParam,lParam);


本文链接地址: 键盘钩子
https://blog.qingfengju.com/index.asp?id=144

上一篇: 将默认浏览器设置为自己的浏览器需要的全部注册表项
下一篇: 在脚本中创建窗体

分类:Win32/C++ 查看次数:6798 发布时间:2009/8/20 16:01:08