質問

私は(UP ARROWのような)キーの押下を記録したいここでコンソールアプリケーションを作成しています。私は、任意のスレッドですべてのキーの押下をキャプチャし、私のコールバック関数を呼び出すことになっている低レベルのキーボードフックを作成しましたが、それは動作しません。プログラムは、私はキーを押したときにビットのために屋台が、コールバックを呼び出すことはありません。私は、ドキュメントをチェックしたが、何も見つかっていません。私は間違って)私はは、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);
}
役に立ちましたか?

解決

あなたはシステムコール(getchar関数)をブロックすることはできません、あなたは窓のループを実行しているし、あなたのフックが呼び出される前に、メッセージを処理する必要があります。

他のヒント

はWindows XPでは、あなたが必要とする、あなたはhInstanceに3番目の引数として(WinMainから)SetWindowsHookExを渡す必要があります。たとえばます:

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

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

// ...
私が最初にsimle示唆;

// VB:アプリケーションのインスタンスを取得します。   HINSTANCE appInstance =のGetModuleHandle(NULL);

その後、

と: hookHandle =は、SetWindowsHookEx(WH_KEYBOARD_LL、keyHandler、appInstance、0);

// ...、

が、別のエラーが発生した後に、あまりにも

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top