2015-06-19 4 views
1

Я пытаюсь создать программу, которая будет симулировать нажатие кнопки клавиатуры.Как имитировать удерживание кнопки клавиатуры в 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 теперь получают нажатия клавиш правильно.

+0

Вы пробовали в приложении с контуром сообщения? Для функций, связанных с входными событиями, не следует думать, что для завершения процесса требуется цикл сообщений. – tenfour

+0

Я не знаком с контуром сообщений, не могли бы вы уточнить? – ShiiNko

+2

Большинство игр используют DirectInput или подобных и не реагируют на сообщения окна. Это означает, что 'keybd_event',' SendMessage' и связанные с ними не работают. – MicroVirus

ответ

1

Ради отсчета, так как он уже был дан ответ в комментариях, вы должны использовать SendInput, а не SendMessage, при заполнении INPUT структуры, необходимой для функции SendInput убедитесь, что вы объедините ваши Flags с KEYEVENTF_SCANCODE отправить аппаратные сигналы вместо виртуальных. Они будут обрабатываться DirectInput. Источник: Simulating Keyboard with SendInput API in DirectInput applications

Смежные вопросы