SendInput () нажмите 6 и не правильно - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь использовать SendInput для отправки нажатий клавиш. Код работает, например, если я пытаюсь отправить ключ A, но если я пытаюсь нажать клавишу со стрелкой вправо, он набирает 6. Понятия не имею, почему.

[DllImport("USER32.DLL")]
    public static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
    public static extern IntPtr FindWindow(string lpClassName,
        string lpWindowName);

    [DllImport("user32.dll")]
    internal static extern uint SendInput(
        uint nInputs,
        [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
        int cbSize);

    private void button1_Click(object sender, EventArgs e)
    {
        SetForegroundWindow(FindWindow("Notepad", "Untitled - Notepad"));
        SendInputWithAPI();
    }


    void SendInputWithAPI()
    {
        INPUT[] Inputs = new INPUT[1];
        INPUT Input = new INPUT();

        Input.type = 1; // 1 = Keyboard Input
        Input.U.ki.wScan = ScanCodeShort.RIGHT;
        Input.U.ki.dwFlags = KEYEVENTF.SCANCODE;
        Inputs[0] = Input;


        SendInput(1, Inputs, INPUT.Size);
    }

Кстати ScanCodeShort.RIGHT возвращает 77. Спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

Коды сканирования представляют физические ключи. При разных раскладках и состояниях клавиатуры один и тот же физический ключ может иметь разные значения, но его код сканирования всегда будет одинаковым. То есть физическая клавиша «numpad 6» может означать стрелку вправо или цифру 6 в зависимости от состояния Num Lock.

Если ваша цель состоит в том, чтобы «нажать» логическую «стрелку вправо», в отличие от определенной физической клавиши на физической клавиатуре, независимо от ее текущего значения, вы должны вместо этого использовать коды виртуальных клавиш. Они представляют текущее значение физического ключа. Предполагая, что ваше INPUT объявление структуры является правильным :

private const int INPUT_KEYBOARD = 1;
private const int VK_RIGHT = 0x27;
Input.type = INPUT_KEYBOARD;
Input.U.ki.wVk = VK_RIGHT;
Inputs[0] = Input;
...