2016-02-15 3 views
1

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

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

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

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

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

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

Таким образом, SendInput также обеспечивает абстракцию.

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

+0

игры многое сделать, чтобы попытаться предотвратить это, по понятным причинам. Я бы подумал об использовании платы arduino для имитации клавиатуры. – Matt

+0

@Matt SendInput работает отлично, только с недостатком, который работает только на сфокусированном окне. – SMUsamaShah

+0

Если вы посмотрите на параметры [SendInput] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646310.aspx), должно быть сразу очевидно, что вы не можете контролировать, где вход идет. Для выполнения этой работы API более высокого уровня не существует, а «PostMessage» является воплощением неправильного. Причина для downvote: вы были 100 000-м членом, чтобы задать этот вопрос, другими словами: он * «не показывает исследовательских усилий» *. – IInspectable

ответ

7

При регистрации вашего устройства ввода с использованием структуры 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;