c语言中的全局键盘挂钩

c语言中的全局键盘挂钩,c,windows,hook,keyboard-hook,C,Windows,Hook,Keyboard Hook,我想写一个全局键盘钩子来禁止任务切换。当我在谷歌上搜索时,我在c#、cpp(和delphi)中发现了大量代码,但我需要一些关于钩子的基本概念(如果示例是c,那最好)。因此,请推荐一些参考资料和链接,帮助我从c的角度理解这个问题 PS:我发现了一个不错的(适用于winXP和旧版本),但当我尝试编译代码时,它给了我: 我试着搜索所有标题中的“IDC_”常量(MinGW gcc安装附带的默认标题和开发人员提供的标题),但是没有运气…如果有人可以编译代码并使其运行,请帮助我。我没有上传源代码本身在这里

我想写一个全局键盘钩子来禁止任务切换。当我在谷歌上搜索时,我在c#、cpp(和delphi)中发现了大量代码,但我需要一些关于钩子的基本概念(如果示例是c,那最好)。因此,请推荐一些参考资料和链接,帮助我从c的角度理解这个问题

PS:我发现了一个不错的(适用于winXP和旧版本),但当我尝试编译代码时,它给了我:

我试着搜索所有标题中的“IDC_”常量(MinGW gcc安装附带的默认标题和开发人员提供的标题),但是没有运气…如果有人可以编译代码并使其运行,请帮助我。我没有上传源代码本身在这里,因为有一些头文件的依赖关系,在这种情况下,我将不得不张贴所有的代码在这里


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

假设您在Windows上,并且希望捕获全局击键,我将在这里冒险。一种方法是使用lowlevelhook。请看以下示例:

在代码中的某个位置定义此回调函数:

//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);
可以找到关于钩子的更多一般信息。
您还可以按照文档中给出的说明,以相同的方式捕获其他全局事件

您打算将此应用于哪个平台?WinXP?如果是这样的话,Winapi有一种实现全局键盘挂钩的方法。我忘了提到这个问题了……是的,winXP是目标环境,但如果我让它也运行Win7会更好。我明白了,一般来说,我需要看看它是否在Windows下。检查我下面的答案是否有帮助。这是一个很好的例子,“我想解X,我认为复杂的解是Y。我会问Y。”你真正应该做的可能是问X。捕捉击键不会阻止任务切换。@tenfour为什么?如果我禁用ALT和WIN键,您仍然可以切换任务吗?