【问题标题】:global keyboard hooks in cc语言中的全局键盘钩子
【发布时间】:2012-02-27 07:22:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你打算在什么平台上使用它?操作系统?如果是这样的话,Winapi 有办法实现全局键盘钩子。
  • 我忘了提到这个问题......是的,winXP 是目标环境,但如果我让它也运行 Win7 会更好。
  • 我明白了,总的来说,我需要看看它是否在 Windows 下。检查我下面的回答是否有帮助。
  • 这是一个很好的例子,“我想解 X,我认为卷积解是 Y。我会问 Y。”您真正应该做的是询问 X。捕获击键不会阻止任务切换。
  • @tenfour 为什么?如果我禁用 ALT 和 WIN 键,你还能切换任务吗?

标签: c windows hook keyboard-hook


【解决方案1】:

假设您在 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 文档中给出的说明以完全相同的方式捕获其他全局事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多