0

キーが押されたときに特定の操作の実行を開始するマクロ アプリケーションを作成しようとしています (システム全体のショートカット)。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' に変換できません

4

1 に答える 1