я пытаюсь отправить WM_INPUT-сообщение приложению, но я сталкиваюсь с несколькими препятствиями, которые мне не удается решить.
Я создал RAWINPUT-структуру следующим образом:
//try sending 'W'
RAWINPUT raw = {0};
char c = 'W';
//header
raw.header.dwSize = sizeof(raw);
raw.header.dwType = RIM_TYPEKEYBOARD;
raw.header.wParam = 0; //(wParam & 0xff =0 => 0)
raw.header.hDevice = hDevice;
//data
raw.data.keyboard.Reserved = 0;
raw.data.keyboard.Flags = RI_KEY_MAKE; //Key down
raw.data.keyboard.MakeCode = static_cast<WORD>(MapVirtualKeyEx(c, MAPVK_VK_TO_VSC, GetKeyboardLayout(0)));
raw.data.keyboard.Message = WM_KEYDOWN;
raw.data.keyboard.VKey = VkKeyScanEx(c, GetKeyboardLayout(0));
raw.data.keyboard.ExtraInformation = 0; //???
//Send the message
SendMessage(hPSWnd, WM_INPUT, 0, (LPARAM)raw/*Raw input handle*/); //TODO: Handle to raw input
Где я застрял, по крайней мере две позиции:
Есть ли необходимость передавать что-то особенное raw.data.keyboard.ExtraInformation
, либо это GetMessageExtraInfo()
или здесь не нужно ничего пропускать?
LPARAM-параметр сообщения WM_INPUT содержит дескриптор RAWINPUT-структуры, а не адрес или саму структуру … Как создать такой дескриптор?
Я не хочу использовать SendInput, потому что он требует, чтобы окно было активным окном.
Я уже сделал это, и он работал нормально, но когда я активировал другое окно — конечно, он перестал работать на предыдущем.
Так что я пытаюсь добиться, посылая входные данные в приложение, которое не обязательно должно быть активным.
Все необработанная исходная документация ориентирован на обработку необработанных сообщений, отправляемых в ваше приложение системой. Нет никаких признаков того, что он будет работать правильно, если ваше приложение отправит такие сообщения другому приложению. Принимающая заявка должна зарегистрироваться, чтобы получить WM_INPUT
Сообщения, и большинство приложений нет.
Вы, вероятно, хотите использовать Microsoft UI Automation вместо.
Но если вы хотите поэкспериментировать с WM_INPUT
…
LPARAM-параметр сообщения WM_INPUT содержит дескриптор RAWINPUT-структуры, а не адрес или саму структуру … Как создать такой дескриптор?
Это очень старый API, который предполагает использование дескрипторов одного из менеджеров памяти на основе дескрипторов.
HGLOBAL hRaw = ::GlobalAlloc(GHND, sizeof(RAWINPUT));
RAWINPUT *pRaw = reinterpret_cast<RAWINPUT*>(::GlobalLock(hRaw));
// initialize the structure using pRaw
::GlobalUnlock(hRaw);
// use hRaw as the LPARAM
Других решений пока нет …