3

カスタムキーボードレイアウトを作成しています。最初のステップとして、ユーザーにキーを押してもらい、キーボードフックにそれをインターセプトさせて、選択した別のキーを出力させたいと思います。

私はこのキーボードフックコードを見つけました。これは私の目的のために少し変更しようとしています:http: //blogs.msdn.com/toub/archive/2006/05/03/589423.aspx

関連する方法を次のように変更しました。

private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
        KBDLLHOOKSTRUCT replacementKey = new KBDLLHOOKSTRUCT();
        Marshal.PtrToStructure(lParam, replacementKey);
        replacementKey.vkCode = 90; // char 'Z'
        Marshal.StructureToPtr(replacementKey, lParam, true);
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
}

新しいKBD構造体オブジェクトを宣言し、キーボードフックによって提供されたKBD構造体をコピーし、オブジェクトのvkCodeを変更して別の文字を使用してから、提供されたオブジェクトを変更したバージョンで上書きします。これにより、異なる文字を書き込むという事実を除いて、すべてが同じに保たれることが期待されます。

残念ながら、それは機能していません。元のキーボード文字が入力されます。VisualStudioの出力ペインにもA first chance exception of type 'System.ArgumentException' occurred in MirrorBoard.exeエラーが発生します。

キーボードフックをインターセプトして、選択したキャラクターに置き換えるには、ここで何ができますか?

ありがとう!

4

1 に答える 1

5

の2番目のパラメータMarshal.PtrToStructureは、構造体ではなくクラスである必要があり、KBDLLHOOKSTRUCTおそらく構造体です。

代わりに、次のように使用する必要があります。

KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
replacementKey.vkCode = 90; // char 'Z'
Marshal.StructureToPtr(replacementKey, lParam, false);
于 2010-01-14T07:34:02.713 に答える