キーが押されたときに特定の操作の実行を開始するマクロ アプリケーションを作成しようとしています (システム全体のショートカット)。Visual Studio 2012 で Windows フォーム アプリケーションを作成しました。フォームが読み込まれると、キーボード フックがインストールされます。
HookHandle = SetWindowsHookEx( WH_KEYBOARD_LL, (HOOKPROC)keyboardHookHandler, GetModuleHandle(NULL), NULL);
if( HookHandle == 0){
MessageBox::Show("Error setting hook!");
}
私のフックコールバック関数は次のとおりです。
public: static LRESULT CALLBACK keyboardHookHandler( int code, WPARAM wParam, LPARAM lParam ) {
if(code>=0 && wParam == WM_KEYDOWN){
MessageBox::Show("Key Down");
}
return CallNextHookEx( HookHandle, code, wParam, lParam);
}
アプリケーションをコンパイルして実行すると、メッセージ ボックスが表示されません。さらに言うと、このコールバック関数が起動されることはわかっていますが、wParam には常に値 45 が含まれています (チェックしたところ、返されるべき WM 定数の値は 45 ではありません)。また、いくつかの重要なイベントの後、アプリケーションがクラッシュします。
このコードが正常に機能しない理由は何ですか?
更新: HOOKPROC へのキャストを削除し、委任された手順に変更しました:
private:
delegate LRESULT CALLBACK HOOKPROC( int code, WPARAM wParam, LPARAM lParam );
HOOKPROC^ keyboardHookProcedure;
フックの設定は次のとおりです。
keyboardHookProcedure = gcnew HOOKPROC(this, &MyForm::keyboardHookHandler);
HookHandle = SetWindowsHookEx( WH_KEYBOARD_LL, keyboardHookProcedure, GetModuleHandle(NULL), NULL);
しかし今、私はこの問題を抱えています:
エラー C2664: 'SetWindowsHookExW': パラメーター 2 を 'WindowsFormTest::MyForm::HOOKPROC ^' から 'HOOKPROC' に変換できません