c中的全局键盘钩子

buc*_*h11 2 c windows hook keyboard-hook

我想编写一个全局键盘钩子来禁止任务切换.当我用Google搜索时,我在c#,cpp(和delphi)中找到了很多代码,但我需要一些关于挂钩的基本概念(如果示例在C中则会是最好的那么,请建议资源,链接可以帮助我理解C的角度.

PS:我发现了一个很好的工作示例(适用于winXP和旧版本),但是当我尝试编译代码时它给了我: 在此输入图像描述

我尝试在所有标题中搜索"IDC_"常量(MinGW gcc安装和开发人员提供的默认值),但没有运气......如果任何人可以编译代码并让它运行请帮助我我没有在这里上传源本身,因为有一些头文件依赖,在这种情况下,我必须在这里发布所有代码.

winXP是目标环境,但如果我让它运行Win7也会更好.

Lef*_*ris 9

假设您使用的是Windows,并且您希望捕获全局击键,我将在这里发挥作用.一种方法是使用LowLevelHooks.请看以下示例:

在代码中的某处定义此回调函数:

//The function that implements the key logging functionality
LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
   char pressedKey;
   // Declare a pointer to the KBDLLHOOKSTRUCTdsad
   KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
   switch( wParam )
   {
       case WM_KEYUP: // When the key has been pressed and released
       {
          //get the key code
          pressedKey = (char)pKeyBoard->vkCode;
       }
       break;
       default:
           return CallNextHookEx( NULL, nCode, wParam, lParam );
       break;
   }

    //do something with the pressed key here
      ....

   //according to winapi all functions which implement a hook must return by calling next hook
   return CallNextHookEx( NULL, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)

然后在你的main函数中的某个地方你可以像这样设置钩子:

 //Retrieve the applications instance
 HINSTANCE instance = GetModuleHandle(NULL);
 //Set a global Windows Hook to capture keystrokes using the function declared above
 HHOOK test1 = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, instance,0);
Run Code Online (Sandbox Code Playgroud)

有关钩子的更多一般信息可以在这里找到.您也可以按照SetWindowsHooksEX文档中给出的说明以相同的方式捕获其他全局事件.