Как смоделировать комбинацию клавиш (например, Shift + Влево для выделения текста), используя глобальный хук клавиатуры и postmessage ()? - PullRequest
2 голосов
/ 07 апреля 2011

Я использую глобальную клавиатуру (WH_KEYBOARD_LL) и отправляю ключи в дескриптор браузера.Я могу получить нажатие одной клавиши пользователем, но не могу получить комбинацию нажатых клавиш (например, Shift + Влево для выбора текста). Код идет ниже ...

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;
};

IПрочитайте где-нибудь, где мы можем получить комбинацию нажатий клавиш с помощью wParam, которая выдает ошибку, как показано в коде выше.Пожалуйста, предложите, как избежать этой ошибки или какой-нибудь альтернативный способ сделать это.

1 Ответ

1 голос
/ 11 апреля 2011

В вашем коде есть ошибки.Вы рассматриваете wParam как указатель (так как вы вызываете ReadInt32 с ним), но согласно документации он содержит сообщение окна.

lParam вы должны разыменовать (используя Marshal.PtrToStructure) в KBDLLHOOKSTRUCT , он содержит код ключа и состояние ключа модификатора.

И я не вижу смысла в приведении vkCode к значению System.Windows.Fórms.Keys,а затем снова обратно к int.

...