2

グローバル キーボード フック (WH_KEYBOARD_LL) を使用して、キーをブラウザー ハンドルに送信しています。ユーザーが1つのキーを押すことはできますが、キーの組み合わせを押すことはできません(テキストを選択するためのシフト+左など)。コードは以下のとおりです...

private IntPtr ProcessKey(int nCode, IntPtr wParam, IntPtr lParam)
{
    if (nCode >= 0
        && wParam == (IntPtr)WM_KEY_EVENT.WM_KEYDOWN
        || wParam == (IntPtr)WM_KEY_EVENT.WM_SYSKEYDOWN)
    {
        int vkCode = Marshal.ReadInt32(lParam);
        int vkCode1 = Marshal.ReadInt32(wParam);//here I am getting runtime
        //error as Attempted to read or write protected memory.
        //This is often an indication that other memory is corrupt. 

        SafeNativeMethods.PostMessage(m_browserHandle,(uint)WM_KEY_EVENT.WM_KEYDOWN,  
            Convert.ToInt32((System.Windows.Forms.Keys)vkCode),
            Convert.ToInt32((System.Windows.Forms.Keys)vkCode1));
    }

    return SafeNativeMethods.CallNextHookEx(_hookID, nCode, wParam, lParam);
}

[DllImport("user32.dll", SetLastError = true)]
public static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);

public static class WM_KEY_EVENT
{
    public static int WM_KEYDOWN = 0x0100;
    public static int WM_SYSKEYDOWN = 0x0104;
    public static int WM_KEYUP=0x0101;
    public static int WM_SYSKEYUP=0x0105;
};

上記のコードに示すように、wParam を使用してキー押下の組み合わせを取得できる場所をいくつか読んだところ、エラーが発生しました。そのエラーを回避する方法またはそれを行う別の方法を提案してください。

4

1 に答える 1

1

あなたのコードにはいくつかのエラーがあります。wParam をポインターとして扱っていますが (それを使用して ReadInt32 を呼び出しているため)、ドキュメントによると、ウィンドウ メッセージが含まれています。

lParam は、(Marshal.PtrToStructure を使用して) KBDLLHOOKSTRUCT に逆参照する必要があります。これには、キー コードと修飾キーの状態が含まれています。

そして、vkCode を System.Windows.Fórms.Keys 値にキャストしてから、再び int にキャストする意味がわかりません。

于 2011-04-10T22:22:06.227 に答える