Как правильно заполнить структуру HARDWAREINPUT для использования с SendInput?

Я пытаюсь отправить пару WM_KEYDOWN / WM_KEYUP в приложение, которое обычно НЕ отвечает на использование структуры KEYBDINPUT. Мне нужно будет отправить управляющую клавишу, а также буквенно-цифровые символы. Поскольку MSDN дает только расплывчатую информацию об использовании аппаратной структуры, я могу только предположить, что поле uMsg предназначено для хранения сообщений WM_KEYDOWN / WM_KEYUP, а следующие два поля предназначены для LOWORD и HIWORD для lParam (состоит из нескольких битов, которые определить код сканирования, является ли ключ «повторяющимся» и т. д.).

Но после нескольких часов работы с этими значениями я полностью теряюсь в том, как правильно имитировать аппаратное нажатие клавиш. Что я могу сделать, чтобы заставить это работать?

0

Решение

Вы не должны использовать аппаратное обеспечение вообще. Чтобы смоделировать ввод с клавиатуры, вы должен используйте INPUT.type = INPUT_KEYBOARD и установите элементы INPUT.ki. Опция INPUT_HARDWARE зарезервирована для устройств ввода Другой чем мышь или клавиатура.

Если приложение не отвечает на этот ввод, то следующая вероятная проблема — это проблема фокуса. SendInput () может работать только тогда, когда окно приложения находится на переднем плане, а дочернее окно в приложении, которому требуется ввод, имеет фокус. Это может быть трудно достичь. Альтернативой для ввода ключей является отправка сообщений WM_CHAR с SendMessage непосредственно в окно, которое должно их получить. Что также позволяет избежать значительной сложности при работе с активной раскладкой клавиатуры и состоянием клавиш-модификаторов (Alt, Shift, Ctrl). Новая проблема, с которой вы столкнулись, — это получение правильного дескриптора окна.

2

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

Оказалось, что я неправильно реализовал KEYBDINPUT, а также отправлял каждое нажатие клавиши одним вызовом SendInput. Следующее, кажется, работает для стандартных и расширенных виртуальных ключей в моем целевом приложении:

VOID SimulateKeystroke(USHORT vk, BOOL bExtended)
{
INPUT input = {0};

if(bExtended) input.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
input.ki.wVk  = vk;
input.type = INPUT_KEYBOARD;
SendInput(1, &input, sizeof(input));

ZeroMemory(&input, sizeof(INPUT));
input.ki.dwFlags  =  KEYEVENTF_KEYUP;
if( bExtended ) input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;

input.ki.wVk = vk;
input.type = INPUT_KEYBOARD;
SendInput(1, &input, sizeof(input));
}
0

По вопросам рекламы [email protected]