c++ - WinAPI - GetRawInputBuffer

标签 c++ windows winapi

我对 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 始终为零。如果我在 case WM_INPUT 中使用 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 之外的所有内容 消息。

关于c++ - WinAPI - GetRawInputBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28879021/

相关文章:

c - 获取可用驱动器及其大小的列表

c++ - 绘画后winapi窗口不刷新

c++ - 消除 C++ 动态库的编译器间不兼容问题

c++ 用作虚拟基础的类可以具有带参数的构造函数吗?

c++ - 如何在 Windows 上正确地将拉丁字符打印到 C++ 控制台?

Node.js 符号链接(symbolic link)连接在 Windows 上损坏?

c++ - 如何通过 Windows API 关闭电脑?

c++ - MPI_Scatter,分散对角元素

c++ - 从字母构建单词的最佳方法

C++ Qt WriteProcessMemory