在Qt中记录所有鼠标移动

时间:2020-02-06 04:31:58

标签: c++ windows qt winapi event-handling

我尝试在C ++中完成一些指向任务。我用Qt创建了GUI。在应用程序中,我将光标替换为QWidget上的自绘点。所以以后我可以操纵光标的移动。在每个Mouseevent上,我都会进行更新。问题是,记录所有鼠标的移动非常重要。即使是鼠标的RawInputData,也需要本机Windows事件。当我使用Qt的本机事件处理程序时,问题是,更新Widget时我的线程被阻止了。因此,尝试将事件处理和绘图分开在两个不同的线程中。但这似乎很困难。因此,我的第二个想法是创建一个不可见的Windows窗口,该窗口捕获所有信息,然后将它们交给Qt处理。但是我无法制作这样的Windows窗口。目前,我还没有收到任何消息。以后它应该在后台运行。

我的Qt尝试:

bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result) {
    MSG *msg = (MSG*)message;
    switch(msg->message)
    {
    case WM_INPUT: {

            POINT lpPoint;
            GetCursorPos(&lpPoint);
            xCursor = lpPoint.x;
            yCursor = lpPoint.y;
            //std::cerr << "Cursor: X: " << lpPoint.x << " || Y: " << lpPoint.y << std::endl;

            UINT dwSize;

            GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, NULL, &dwSize,
                            sizeof(RAWINPUTHEADER));
            LPBYTE lpb = new BYTE[dwSize];
            if (lpb == NULL)
            {
                return 0;
            }

            if (GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, lpb, &dwSize,
                 sizeof(RAWINPUTHEADER)) != dwSize )
                 OutputDebugString (TEXT("GetRawInputData does not return correct size !\n"));

            RAWINPUT* raw = (RAWINPUT*)lpb;
            if(raw->header.dwType == RIM_TYPEMOUSE) {
                //std::cerr << "RAW: X: " << raw->data.mouse.lLastX << " || Y: " << raw->data.mouse.lLastY << std::endl;
            }

            delete[] lpb;

            update();

            return false;

        }


    default:{
        //std::cerr << "other Message" << std::endl;
            return false;
        }
    }
}

我的消息窗口:


    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
    std::cerr << "callback" << std::endl;
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int main(int argc, char *argv[])
{
    const char CLASS_NAME[]  = "Sample Window Class";

    WNDCLASS wc = { };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = GetModuleHandle(NULL);
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
            0,                              // Optional window styles.
            CLASS_NAME,                     // Window class
            "Learn to Program Windows",    // Window text
            WS_OVERLAPPEDWINDOW,            // Window style

            // Size and position
            CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

            HWND_MESSAGE,       // Parent window
            NULL,       // Menu
            GetModuleHandle(NULL),  // Instance handle
            NULL        // Additional application data
    );

    if (hwnd == NULL)
    {
        return 0;
    }

    MSG msg;
    while (GetMessage(&msg, hwnd, 0 ,0)) {
        std::cerr << "Message received!" << std::endl;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

我将很高兴收到任何意见或建议。

0 个答案:

没有答案
相关问题