C Виртуальный ввод с клавиатуры выборочно работает

Я работаю над проектом, который нуждается в виртуальном вводе, который кодируется в Microsoft Visual Studios с помощью заголовка windows.h. Для этого я использую метод keybd_event() и метод VkKeyScan():

keybd_event(VkKeyScan('w'), 0, 0, 0);
keybd_event(VkKeyScan('w'), 0, KEYEVENTF_KEYUP, 0);

Однако виртуальный ввод распознается только некоторыми программами, такими как "Блокнот", "Командная строка", браузерами и другими приложениями, использующими текстовые поля. Целью виртуального ввода для моего проекта является использование клиента для управления "VisualGameBoyAdvance", который принимает ввод с клавиатуры, который затем преобразуется в команду, такую ​​как "w" = начало, "z" = кнопка и т. Д.

Почему виртуальный ввод читается при использовании приложений в текстовых полях, а не как команды? Есть ли альтернативные методы файла заголовка windows.h или есть лучшие методы в заголовке?

Обновление: я пытался использовать VkKeyScanEx() в качестве альтернативного метода для принятия виртуального ввода в качестве удара в темноте. Как мне указать свой входной идентификатор локали? Я пытался использовать UTF-8 и en_AU.UTF-8, но безуспешно. Есть ли таблица, которая переводит, как это указать?

Я также пытался использовать

keybd_event(GetKeyState('w'), 0, 0, 0);
keybd_event(GetKeyState('w'), 0, KEYEVENTF_KEYUP, 0);

Который вообще не работал и пробовал

while(1){
        /*Sleep(1000);
        keybd_event(GetKeyState('w'), 0, 0, 0);
        keybd_event(GetKeyState('w'), 0, KEYEVENTF_KEYUP, 0);*/
        // Pause for 5 seconds.
    Sleep(500);

    // Set up a generic keyboard event.
    ip.type = INPUT_KEYBOARD;
    ip.ki.wScan = 0; // hardware scan code for key
    ip.ki.time = 0;
    ip.ki.dwExtraInfo = 0;

    // Press the "W" key
    ip.ki.wVk = 0x57; // virtual-key code for the "a" key
    ip.ki.dwFlags = 0; // 0 for key press
    SendInput(1, &ip, sizeof(INPUT));

    // Release the "A" key
    ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
    SendInput(1, &ip, sizeof(INPUT));

    // Exit normally
    }

1 ответ

Решение

Проблема заключалась в том, что игра работала через DirectX, что предотвращало виртуальные нажатия клавиш. Рендируя игру прямо из sys, она избежала DirectX все вместе и работала нормально:)

Другие вопросы по тегам