我对GetRawInputBuffer有问题。代码没有返回错误,但是检索到的响应中没有数据。
我已经根据Using GetRawInputBuffer correctly编写了代码
UINT RawInputSize;
UINT Result;
Result = GetRawInputBuffer(NULL, &(RawInputSize), sizeof(RAWINPUTHEADER));
if (Result == -1)
{
DWORD ErrorCode = GetLastError();
return;
}
UINT AllocatedBufferByteCount = RawInputSize * 16;
RAWINPUT* RawInputBuffer = reinterpret_cast<RAWINPUT*>(malloc(AllocatedBufferByteCount));
UINT AllocatedBufferByteCountTwo = AllocatedBufferByteCount;
Result = GetRawInputBuffer(RawInputBuffer, &(AllocatedBufferByteCountTwo), sizeof(RAWINPUTHEADER));
if (Result == -1)
{
DWORD ErrorCode = GetLastError();
return;
}
UINT RawInputCount = Result;
RAWINPUT* RawInput = RawInputBuffer;
for (unsigned int i = 0; i < RawInputCount; ++i)
{
switch (RawInput->header.dwType)
{
case RIM_TYPEMOUSE:
{
this->UpdateMouse(RawInput->data.mouse);
break;
}
case RIM_TYPEKEYBOARD:
{
this->UpdateKeyboard(RawInput->data.keyboard);
break;
}
}
RawInput = NEXTRAWINPUTBLOCK(RawInput);
}
DefRawInputProc(&(RawInputBuffer), RawInputCount, sizeof(RAWINPUTHEADER));
该代码在
case WM_INPUT
之外被称为。 RawInputCount
始终为零。如果在GetRawInputData
中使用case WM_INPUT
,则表示我正确接收数据。此代码有什么问题,为什么我的结果为空?
最佳答案
答案来得有点晚,但是由于我最近有同样的问题,我还是会回答:
GetRawInputBuffer使用WM_INPUT
消息来获取和缓冲消息。但是,您可以适当地使用while(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE))
之类的方法来处理您的窗口消息,该消息会在发送到您的应用程序后删除所有消息。这样,输入消息将不会发送到GetRawInputBuffer方法,并且该方法将始终返回大小为0。要解决此问题,您需要使用以下类似内容作为主循环:
//Process and remove all messages before WM_INPUT
while(PeekMessage(&Message, NULL, 0, WM_INPUT - 1, PM_REMOVE))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
//Process and remove all messages after WM_INPUT
while(PeekMessage(&Message, NULL, WM_INPUT + 1, (UINT)-1, PM_REMOVE))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
这样,
WM_INPUT
消息就不会被您的应用程序处理或删除,并因此发送到GetRawInputBuffer。显然,您也可以将PM_REMOVE
标志与PM_NOREMOVE
交换,但是这可能会导致其他问题,因此,我建议您使用上述方法来处理和删除除WM_INPUT
消息以外的所有消息。关于c++ - WinAPI-GetRawInputBuffer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28879021/