C语言中的全局键盘钩子

3
我想编写一个全局键盘钩子,以禁止任务切换。当我在谷歌上搜索时,我发现了很多用C#、cpp(和Delphi)编写的代码,但我需要一些关于钩子的基本概念(最好是用C语言的示例)。因此,请推荐一些资源和链接,帮助我从C语言的角度理解这个问题。
PS:我找到了一个好的可工作示例(适用于WinXP和旧版本),但当我尝试编译代码时,它给了我以下错误: enter image description here 我已经尝试在所有头文件中搜索“IDC_”常量(包括MinGW gcc安装的默认头文件和开发人员提供的头文件),但没有成功。如果有人能够编译并运行该代码,请帮助我。由于存在一些头文件依赖性,我没有在此处上传源代码,否则我将不得不在此处发布所有代码。
WinXP是目标环境,但如果能在Win7上运行就更好了。

1
你打算在哪个平台上使用这个程序?WinXP吗?如果是的话,Winapi有一种实现全局键盘钩子的方法。 - Lefteris
我忘了在问题中提到...是的,WinXP是目标环境,但如果能让它运行Win7会更好。 - buch11
我理解了,总的来说,我需要看一下它是否在Windows系统下运行。请检查下面我的回答是否有帮助。 - Lefteris
这是一个很好的例子:“我想解决 X,而我认为错综复杂的解决方案是 Y。我会问有关 Y 的问题。” 你真正应该做的是问 X。捕获按键并不能防止任务切换。 - tenfour
@tenfour 为什么?如果我禁用ALT和WIN键,你还能切换任务吗? - buch11
显示剩余3条评论
1个回答

11

我猜你使用的是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);
}

然后在主函数的某个地方,您将设置钩子,如下所示:

 //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);

关于钩子的更多详细信息可以在这里找到。 您还可以按照SetWindowsHooksEX文档中给出的指示以完全相同的方式捕获其他全局事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接