SendInput в фоновое окно

Я хочу отправить ввод с помощью мыши и клавиатуры, полученный от клиента Android, в игры, работающие на Windows.
SendInput работает почти для всех игр, в которых я работал до сих пор. Но для SendInput Для работы игры должно быть переднее окно.

Чтобы решить, что я использовал PostMessage(hwnd,...) с hwnd, являющимся дескриптором окна игры. Но это не работает, если игра использует DirectInput. Это было решено путем подключения GetDeviceState, Теперь другая игра, над которой я начал работать, использует WM_INPUT или необработанный ввод, и я должен создать необработанный ввод, чтобы заставить его работать.

Согласно этому Статья MSDN

DirectInput — это набор вызовов API, который абстрагирует устройства ввода на
система. Внутренне DirectInput создает второй поток для чтения
Данные WM_INPUT и использование API DirectInput увеличат накладные расходы.
чем просто чтение WM_INPUT напрямую.

directInput работает с использованием WM_INPUT.

SendInput функция вставляет события в структуры INPUT
последовательно в поток ввода с клавиатуры или мыши. Эти события не
перемежаются с другими событиями ввода клавиатуры или мыши, вставленными либо
пользователем (с помощью клавиатуры или мыши) или вызовами keybd_event,
mouse_event или другие вызовы SendInput.

Так что SendInput также предоставляет абстракцию.

Все, что я хочу, это отправлять входные данные приложению независимо, даже когда его окно не в фокусе. Таким образом, я смогу отправлять информацию сразу нескольким играм. Есть ли способ достичь этого с помощью одного высокоуровневого вызова API, такого как SendInput? Можно ли это сделать с помощью SendInput? Есть ли библиотека C / C ++ для этого?

2

Решение

При регистрации устройства ввода с использованием структуры RAWINPUTDEVICE,
установите dwFlags = RIDEV_EXINPUTSINK, чтобы получать входные данные, когда процесс находится в фоновом режиме.

Пример :

RAWINPUTDEVICE rid;

rid.usUsagePage = 1;
rid.usUsage     = 4;    // Joystick
rid.dwFlags     = RIDEV_EXINPUTSINK;
rid.hwndTarget  = window;

if (!RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)))
return -1;
5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector