簡體   English   中英

WinAPI-GetRawInputBuffer

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM