我对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/

10-12 02:06