我有一个应用程序使用原始输入执行一些复杂的操作,我想对它进行一些自动化测试。这是发送输入的代码,虽然有点斩断,以便更容易理解。
发送:
GetRawInputDeviceList(nullptr, &numDevices, sizeof(RAWINPUTDEVICELIST));
rawInputDeviceList = new RAWINPUTDEVICELIST[numDevices];
GetRawInputDeviceList(rawInputDeviceList, &numDevices, sizeof(RAWINPUTDEVICELIST));
HGLOBAL hRaw = ::GlobalAlloc(GHND, sizeof(RAWINPUT));
RAWINPUT *pRaw = reinterpret_cast<RAWINPUT*>(::GlobalLock(hRaw));
pRaw->data.keyboard.MakeCode = 30;
pRaw->data.keyboard.Flags = 0;
pRaw->data.keyboard.Reserved = 0;
pRaw->data.keyboard.VKey = 0x43;
pRaw->data.keyboard.Message = WM_KEYDOWN;
pRaw->data.keyboard.ExtraInformation = 0;
pRaw->header.dwType = RIM_TYPEKEYBOARD;
pRaw->header.dwSize = sizeof(RAWINPUT);
pRaw->header.hDevice = rawInputDeviceList[0].hDevice;
pRaw->header.wParam = (WPARAM)RIM_INPUT;
::GlobalUnlock(hRaw);
SendMessage(hWnd_, WM_INPUT, (WPARAM)RIM_INPUT, (LPARAM)hRaw);
接收:
case WM_INPUT:
UINT size = 0;
if(GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &size, sizeof(RAWINPUTHEADER)))
return GetLastError();
GetLastError()的返回值是ERROR_INVALID_HANDLE(6)。但是如果我自己使用GlobalLock,我可以很好地阅读句柄。
根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms645596(v=vs.85).aspx &#34; lParam:RAWINPUT结构的句柄。这来自WM_INPUT中的lParam。&#34;
我尝试过使用指针,但我收到了同样的错误消息。我已尝试使用/不使用解锁,以及使用LocalAlloc / LocalLock。我已经尝试过使用PostMessage而且结果完全相同,而且我现在已经没有想法了。
答案 0 :(得分:6)
无法在进程之间发送WM_INPUT
消息。与WM_PAINT
类似,它是一种合成消息,只能由系统本身正确生成。 lParam
不仅仅是包含数据的HGLOBAL
,它是一个仅由原始输入代码理解的不透明句柄。
原始输入消息由GetMessage
/ PeekMessage
内部直接生成,相关对象由DefWindowProc
清除。 SendMessage
不会为LPARAM
编组WM_INPUT
,因为这样做的代码没有写入,因为它不打算以这种方式使用。