Chr*_*000 0 c++ windows input raw-input
我有一个应用程序使用原始输入做一些复杂的事情,我想有一些自动化测试.这是发送输入的代码,虽然有点切碎,以便更容易理解.
发送:
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);
Run Code Online (Sandbox Code Playgroud)
接收:
case WM_INPUT:
UINT size = 0;
if(GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &size, sizeof(RAWINPUTHEADER)))
return GetLastError();
Run Code Online (Sandbox Code Playgroud)
GetLastError()的返回值是ERROR_INVALID_HANDLE(6).但是,如果我自己使用GlobalLock,我可以读取句柄.
根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms645596(v=vs.85).aspx"lParam:RAWINPUT 结构的句柄.这来自WM_INPUT中的lParam. "
我试过只使用指针,我得到相同的错误信息.我已尝试使用/不使用解锁,以及使用LocalAlloc/LocalLock.我已经尝试过使用PostMessage而且结果完全相同,而且我现在已经没想到了.
该WM_INPUT
消息不能进程之间发送.就像WM_PAINT
,它是一个合成的消息,只能由系统本身正确生成.它lParam
不仅仅HGLOBAL
包含数据,它是一个不透明的句柄,仅由原始输入代码理解.
原始输入消息由GetMessage
/ PeekMessage
internals 直接生成,关联的对象将被清除DefWindowProc
.SendMessage
不会编组LPARAM
for WM_INPUT
,因为这样做的代码没有写,因为它不打算以这种方式使用.