c++ 当鼠标停止时,GetCursorPos不起作用

euoag5mw  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(188)

我正在制作一个基于UI的DirectX 11应用程序。我一直没有问题,直到我发现PeekMessage()使用高CPU使用率(当窗口最小化时,它的使用率是原来的三倍),所以我决定使用GetMessage(),但现在输入变得很奇怪,我不知道如何解释,当鼠标停止时,它不会给予我光标的位置。
下面是提供光标位置的函数:

Vector2f* InputSystem::GetMousePosition(Window* window, bool normalized) {
    POINT p;
    GetCursorPos(&p);
    RECT r;
    GetClientRect(window->hWnd, &r);
    ScreenToClient(window->hWnd, &p);
    lastMousePos = Vector2i(p.x - (r.right - r.left) / 2.0f, p.y - (r.bottom - r.top) / 2.0f);
    lastMousePos.y *= -1.0f;
    lastMousePos *= 2.0f;
    if (normalized) { lastMousePos /= Vector2f(window->GetClientSize().x, window->GetClientSize().y); }
    return &lastMousePos;
}

和循环:

while (mainWindow.IsRunning()) {
    mainWindow.Broadcast();
    mainWindow.PhaseUpdate();
    mainWindow.Loop();
}

Window::Broadcast()

void Window::Broadcast() {
    if (GetMessageA(&msg, hWnd, NULL, NULL)) {
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
    }
}
uqzxnwby

uqzxnwby1#

GetMessage()会阻塞调用线程直到消息到达。PeekMessage()不会阻塞。您希望在游戏循环中使用类似PeekMessage()的代码而不是GetMessage()。尽管您声明了这一点,但使用PeekMessage()不会增加CPU负载,除非您误用它。例如,与其在每个循环迭代中只调用一次,尝试在第二个循环中调用它,直到消息队列被清空,例如:

void Window::Broadcast() {
    while (PeekMessageA(&msg, hWnd, 0, 0, PM_REMOVE)) {
        TranslateMessage(&msg);
        DispatchMessageA(&msg);
    }
}

另请参阅The dangers of filtering window messages

相关问题