2

ホットキー アプリケーションに SendInput API を使用しようとしています。だから私がやっていることは、グローバルなキーフックを持っていることです.いくつかのキーの組み合わせがヒットすると、代わりに別のキーを送信したいと思います.

私の問題は、シミュレートされたキーを送信すると、フックがそのメッセージを受信し、再帰ループになってしまうことです。

そのため、ExtraInfo / Flags を使用してみましたが、何らかの理由で、設定した値がフックで受け取る値と同じではありません。

var down = new INPUT();
down.Type = (UInt32)InputType.Keyboard;
down.Data.Keyboard = new KEYBDINPUT();
down.Data.Keyboard.KeyCode = (UInt16)keyCode;
down.Data.Keyboard.Scan = 0;
down.Data.Keyboard.Flags = 0; //doesn't matter whatever I set here... never gets back to my hook
down.Data.Keyboard.Time = 0;
down.Data.Keyboard.ExtraInfo = IntPtr.Zero; //doesn't matter whatever I set here... never gets back to my hook

ExtraInfo / Flags に何を設定しても、フックでメッセージを受信するとリセットされます。

    private IntPtr KeyStateChangeCallback(int nCode, IntPtr wParam, ref KEYBDINPUT lParam)
    {
       //lParam.ExtraInfo and lParam.Flags ... is always some mumbo jumbo value or zero...
    }

次のようなセットアップで、低レベルキーボードフック「WH_KEYBOARD_LL」を使用しています。

        proc = KeyStateChangeCallback;
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            hookID = NativeMethods.SetWindowsHookEx(WH_KEYBOARD_LL, proc, NativeMethods.GetModuleHandle(curModule.ModuleName), 0);
        }

他の誰かが同様の問題を抱えていて、私を助けることができますか? 動作するコードサンプルはどれも素晴らしいでしょう:)

4

1 に答える 1

1

ドキュメントによると、GetMessageExtraInfoを呼び出して、フィールド内のデータを取得する必要がありExtraInfoます。

于 2012-11-17T03:21:17.367 に答える