【问题标题】:C++ SetWindowsHookEx WH_KEYBOARD_LL Correct SetupC++ SetWindowsHookEx WH_KEYBOARD_LL 正确设置
【发布时间】:2010-01-30 02:28:43
【问题描述】:

我正在创建一个控制台应用程序,我想在其中记录按键(如向上箭头)。我创建了一个低级键盘挂钩,它应该捕获任何线程中的所有按键并调用我的回调函数,但它不起作用。当我按下一个键时,程序会暂停一段时间,但从不调用回调。我检查了文档,但没有找到任何东西。我不知道我是否错误地使用了 SetWindowsHookEx()(据我所知,它成功创建了钩子)还是我的回调函数不正确!我不确定有什么问题!提前感谢您的帮助。

#include "Windows.h"
#include <iostream>
using namespace std;

HHOOK hookHandle;

LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam);

int _tmain(int argc, _TCHAR* argv[]) {

 hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, NULL, 0);

 if(hookHandle == NULL) {
  cout << "ERROR CREATING HOOK: ";
  cout << GetLastError() << endl;
  getchar();
  return 0;
 }

 MSG message;

 while(GetMessage(&message, NULL, 0, 0) != 0) {
  TranslateMessage( &message );
  DispatchMessage( &message );
 }

 cout << "Press any key to quit...";
 getchar();

 UnhookWindowsHookEx(hookHandle);

 return 0;
}


LRESULT CALLBACK keyHandler(int nCode, WPARAM wParam, LPARAM lParam) {
 cout << "Hello!" << endl;

 // Checks whether params contain action about keystroke
 if(nCode == HC_ACTION) {
  cout << ((KBDLLHOOKSTRUCT *) lParam)->vkCode << endl;
 }

 return CallNextHookEx(hookHandle, nCode, 
            wParam, lParam);
}

【问题讨论】:

  • 请参阅here 了解类似问题,我已回答该问题会对您有所帮助。

标签: c++ key capture hook setwindowshookex


【解决方案1】:

你不能阻塞系统调用(getchar),你必须在你的钩子被调用之前运行一个窗口循环并处理消息。

【讨论】:

  • 如何实现窗口循环?我对 WinAPI 很不熟悉(实际上,窗口循环的目的是什么?)
  • 谢谢,如果我还有问题,我会在几分钟后回复。
  • 所以基本上消息循环将应用程序队列的消息发送到适当的挂钩?我已经让它工作了!谢谢。我发布的代码包含修复。
【解决方案2】:

在 Windows XP 上,您需要将hInstance(来自WinMain)作为第三个参数传递给SetWindowsHookEx。例如:

int WINAPI WinMain
( HINSTANCE hInstance, HINSTANCE hPrevInstance,
  LPTSTR lpCmdLine, int nCmdShow ) {

  hookHandle = SetWindowsHookEx ( WH_KEYBOARD_LL, keyHandler, hInstance, 0 );

// ...

【讨论】:

    【解决方案3】:

    我建议先simle;

    // VB:检索应用程序实例 HINSTANCE appInstance = GetModuleHandle(NULL);

    然后: hookHandle = SetWindowsHookEx(WH_KEYBOARD_LL, keyHandler, appInstance, 0);

    // ...,不过后面还有错误

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2021-03-23
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多