C++ 在Windows上模拟原始输入

C++ 在Windows上模拟原始输入,c++,windows,input,raw-input,C++,Windows,Input,Raw Input,我有一个应用程序,用原始输入做一些复杂的事情,我想对它进行一些自动化测试。这是发送输入的代码,尽管经过了一些简化,以便更容易理解 发送: GetRawInputDeviceList(nullptr, &numDevices, sizeof(RAWINPUTDEVICELIST)); rawInputDeviceList = new RAWINPUTDEVICELIST[numDevices]; GetRawInputDeviceList(rawInputDeviceList, &

我有一个应用程序,用原始输入做一些复杂的事情,我想对它进行一些自动化测试。这是发送输入的代码,尽管经过了一些简化,以便更容易理解

发送:

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);
GetLastError()的返回值是错误\u无效\u句柄(6)。但是,如果我自己使用GlobalLock,我可以很好地阅读手柄

据 “lParam:RAWINPUT结构的句柄。它来自WM_INPUT中的lParam。”


我试着只用一个指针,我得到了同样的错误信息。我尝试过使用/不使用解锁,以及使用LocalAlloc/LocalLock。我尝试过PostMessage,结果都是一样的,现在我没有主意了。

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


原始输入消息由
GetMessage
/
PeekMessage
内部直接生成,相关对象由
DefWindowProc
清理
SendMessage
不会为
WM_输入
封送
LPRAM
,因为这样做的代码不是以这种方式编写的

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


原始输入消息由
GetMessage
/
PeekMessage
内部直接生成,相关对象由
DefWindowProc
清理
SendMessage
不会为
WM_输入
封送
LPRAM
,因为这样做的代码不是以这种方式编写的

您是否尝试直接调用GetRawInputData而不是使用SendMessage?您是否从外部进程执行此操作?您是否尝试直接调用GetRawInputData而不是使用SendMessage?您是否从外部进程执行此操作?我的测试应用程序与正在测试的进程相同。我理解你的另一点,那就是阻止我做我想做的事的原因。我认为如果我创建一个虚拟设备,可以从驱动程序的角度创建消息,我仍然可以测试我的应用程序。我的测试应用程序与正在测试的程序是相同的过程。我理解你的另一点,那就是阻止我做我想做的事的原因。我认为如果我创建一个虚拟设备,可以从驱动程序的角度创建消息,我仍然可以测试我的应用程序。
case WM_INPUT:
  UINT size = 0;  
  if(GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &size, sizeof(RAWINPUTHEADER)))
    return GetLastError();