Как использовать расширенные коды сканирования в SendInput

0

Чтобы подражать некоторым клавишам, я должен отправить туда scancodes, для этого я использую функцию SendInput() из WinAPI, и в большинстве случаев он работает нормально, но как использовать его для отправки scancodes для таких ключей, как "Пауза"? Этот ключ генерирует 6-байтовый scancode (E1 1D 45 E1 9D C5), поскольку scancode в структурировании KEYBDINPUT имеет тип WORD, то есть позволяет использовать scancodes до 2 байтов. Я попробовал scandode 1D45 и 9DC5 с флагом KEYEVENTF_EXTENDEDKEY, предлагая использовать E0\E1 код в зависимости от содержимого. Я также попытался отправить последовательности из шести 1 байтовых команд. Но все это не работает.

  • 0
    Поддельные входные данные, как правило, неправильно.
  • 0
    Это зависит от задачи. Я могу согласиться с вами в случае, если вы разрабатываете собственное программное обеспечение, но в случае, когда вам нужно создать какой-то инструмент, который будет эмулировать клавиатуру в других приложениях, это будет односторонним способом. Я знаю, что есть несколько более простых способов, например SendMessage или PostMessage, но они отправляют сообщения непосредственно в обработчик сообщений окна, а перехватчики клавиатуры не получают эти сообщения. Также приложение может использовать некоторые другие API, такие как прямой ввод, для работы с клавиатурой. В любом случае, он отлично работает, но я не могу понять, как использовать его для ключей с большими кодами сканирования, таких как Pause key.
Теги:
winapi

1 ответ

0

Я нашел ответ. Вы должны отправить два входа в свой массив для SendInput. Первая запись будет 0xE0, а вторая запись будет вашим scancode.

Я нашел решение здесь, встроенное в графику: https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa299374(v=vs.60)

См. Код. Это С#, но вы получите эту идею.

        inputs = new[]
        {
            new WinAPI.INPUT
            {
                type = WinAPI.INPUT_KEYBOARD,

                u = new WinAPI.InputUnion
                {
                    ki = new WinAPI.KEYBDINPUT()
                    {
                        wScan = (ushort) 0xe0,
                        wVk = (ushort) 0,
                        dwFlags = (ushort) dwFlags,
                        dwExtraInfo = WinAPI.GetMessageExtraInfo()
                    }
                }
            },
            new WinAPI.INPUT
            {
                type = WinAPI.INPUT_KEYBOARD,

                u = new WinAPI.InputUnion
                {
                    ki = new WinAPI.KEYBDINPUT()
                    {
                        wScan = (ushort) tscancode,
                        wVk = (ushort) tvk,
                        dwFlags = (ushort) dwFlags,
                        dwExtraInfo = WinAPI.GetMessageExtraInfo()
                    }
                }
            }
        };

Ещё вопросы

Сообщество Overcoder
Наверх
Меню