在Windows上模拟原始输入

时间:2014-03-23 13:36:23

标签: 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);

接收:

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

1 个答案:

答案 0 :(得分:6)

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

原始输入消息由GetMessage / PeekMessage内部直接生成,相关对象由DefWindowProc清除。 SendMessage不会为LPARAM编组WM_INPUT,因为这样做的代码没有写入,因为它不打算以这种方式使用。