c中的全局键盘钩子

时间:2012-02-05 13:25:23

标签: c windows hook keyboard-hook

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

PS:我找到了一个好的working example(适用于winXP和旧版本),但是当我尝试编译代码时它给了我: enter image description here

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

winXP是目标环境,但是如果我还能运行Win7会更好。

1 个答案:

答案 0 :(得分:8)

假设您使用的是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);
}

然后在你的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);

可以找到关于钩子的更多一般信息here。 您也可以按照SetWindowsHooksEX文档中给出的说明,以完全相同的方式捕获其他全局事件。