Я пытаюсь создать программу, которая будет симулировать нажатие кнопки клавиатуры.Как имитировать удерживание кнопки клавиатуры в C++
Эта программа должна работать в играх, где требуются удерживающие кнопки, такие как W, A, S, D. Я тестировал программу как в Grand Theft Auto V, так и в Garry's Mod, но в любом из них он не работал.
Я пробовал использовать SendInput
и keybd_event
функции для эмуляции ввода без везения.
#include <windows.h>
#define VK_W 0x57
using namespace std;
int main(){
while(1){
keybd_event(VK_W, 0, 0, 0);
Sleep(3000); //should hold W for 3 seconds
keybd_event(VK_W, 0, KEYEVENTF_KEYUP, 0);
Sleep(1000);
}
return 0;
}
Я создал макросы с помощью программного обеспечения клавиатуры Razer, которая прекрасно работает, так что должен быть способом для имитации ввода ключа удержания.
Я также попытался созданием AutoHotkey
скрипта, который делает работу в Mod Garry, но не в Grand Theft Auto V:
w::
SendInput {w down}
Sleep 3000
SendInput {w up}
Этот сценарий имеет W в течение 3 секунд при W нажат.
Я пробовал искать в Интернете, но не нашел никакой рабочей реализации.
EDIT: Я искал вокруг немного и нашел это: https://stackoverflow.com/a/3647975/1587051
Оказывается, я использовал Unicode вместо кодов сканирования клавиатуры в сочетании с KEYEVENTF_SCANCODE
флагом. Игры DirectInput теперь получают нажатия клавиш правильно.
Вы пробовали в приложении с контуром сообщения? Для функций, связанных с входными событиями, не следует думать, что для завершения процесса требуется цикл сообщений. – tenfour
Я не знаком с контуром сообщений, не могли бы вы уточнить? – ShiiNko
Большинство игр используют DirectInput или подобных и не реагируют на сообщения окна. Это означает, что 'keybd_event',' SendMessage' и связанные с ними не работают. – MicroVirus