2016-10-29 1 views
2

У нас есть простая программа на C++, которая отправляет/моделирует события возврата ключа в активное окно с помощью keybd_event.Как отправлять события клавиатуры во все виды приложений в окнах?

keybd_event(VK_RETURN, 0x1c, 0, 0); 

Это прекрасно подходит для всех видов приложений Windows. Но мы хотели бы отправить событие с клавиатурой стороннему приложению, например GTA (игра), - и это не сработает. GTA не получает событие клавиатуры.

Почему GTA не получает событие клавиатуры? Есть ли способ заставить его работать с keybd_event? Или есть ли другое решение для отправки событий во все виды приложений (с помощью обычных окон или стандартной библиотеки C++)?

ответ

2

keybd_event - это устаревший вызов API. Попробуйте использовать Модер SendInput функцию API

UINT WINAPI SendInput(
    _In_ UINT nInputs, 
    _In_ LPINPUT pInputs, 
    _In_ int  cbSize 
); 

nInputs Число структур в pInputs массиве.

pInputs Массив из INPUT структур. Каждая структура представляет собой событие, которое должно быть вставлено в поток ввода клавиатуры или мыши.

cbSize Размер, в байтах, структуры INPUT. Если cbSize не является размерностью структуры INPUT, функция не работает.

Эта функция подчиняется UIPI. Приложениям разрешено вводить ввод только в приложения, которые имеют одинаковый или меньший уровень целостности.

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

Эта функция не сбрасывает текущее состояние клавиатуры. Любые клавиши, которые уже нажаты при вызове функции, могут помешать событиям, которые генерирует эта функция. Чтобы избежать этой проблемы, проверьте состояние клавиатуры с помощью функции GetAsyncKeyState и при необходимости исправьте.

Поскольку сенсорная клавиатура использует макросы суррогата, определенные в winnls.h для отправки ввода в систему, слушатель на клавиатурном крючке события должен декодировать вход, исходящий с сенсорной клавиатуры. Для получения дополнительной информации см. Суррогаты и дополнительные символы.

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

1

Этот API является низкоуровневым; поэтому приложения не реагируют на него напрямую. Функция вызывается обработчиком прерываний. Возможно, вы генерируете не тот же самый ввод, который, по вашему мнению, вам нужен для ответа на это приложение. Кроме того, этот API в настоящее время заменяется функцией SendInput, которую я рекомендую использовать вместо keybd_event.