6

キーの押下 (上矢印など) を記録したいコンソール アプリケーションを作成しています。任意のスレッドですべてのキー押下をキャプチャし、コールバック関数を呼び出すことになっている低レベルのキーボード フックを作成しましたが、機能しません。キーを押すとプログラムが少し停止しますが、コールバックは呼び出されません。ドキュメントを確認しましたが、何も見つかりませんでした。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);
}
4

3 に答える 3

3

syscall (getchar) でブロックすることはできません。フックが呼び出される前に、ウィンドウ ループを実行してメッセージを処理する必要があります。

于 2010-01-30T02:32:56.407 に答える
0

Windows XP では、3 番目の引数としてhInstance(from )を に渡す必要があります。例えば:WinMainSetWindowsHookEx

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

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

// ...
于 2014-02-22T06:46:19.480 に答える