[英]WinAPI - GetRawInputBuffer
我對GetRawInputBuffer有問題。 代碼沒有返回錯誤,但是檢索到的響應中沒有數據。
我已經根據此正確使用GetRawInputBuffer編寫了代碼
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
始終為零。 如果我在case WM_INPUT
GetRawInputData
內使用GetRawInputData
,則我正確地接收了數據。
此代碼有什么問題,為什么我的結果為空?
答案來得有點晚,但是由於最近我遇到了同樣的問題,我還是要回答: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
消息以外的所有消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.