在Windows上模拟原始输入

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而且结果完全相同,而且我现在已经没想到了.

Ben*_*Ben 6

WM_INPUT消息不能进程之间发送.就像WM_PAINT,它是一个合成的消息,只能由系统本身正确生成.它lParam不仅仅HGLOBAL包含数据,它是一个不透明的句柄,仅由原始输入代码理解.

原始输入消息由GetMessage/ PeekMessageinternals 直接生成,关联的对象将被清除DefWindowProc.SendMessage不会编组LPARAMfor WM_INPUT,因为这样做的代码没有写,因为它不打算以这种方式使用.