2

我正在尝试将鼠标指针(带有自定义光标)限制在我的应用程序窗口的客户区域,该应用程序最初可以工作,但当我从应用程序切换并返回时遇到问题。我ClipCursor()用来限制光标并使用几个不同的光标,这些光标取决于情况,所以我使用SetCursor()而不是设置窗口的类光标。

通过检查我的 WndProc 中的 WM_SETCURSOR 消息,当 Alt-Tabbing 离开应用程序并返回(我想允许)时,我已经正确恢复了光标:

case WM_SETCURSOR:
{
    if (mIsMouseGrabOn)  // a bool that indicates if the mouse should be restricted to the cient area or not
        SetCursor(gmInstance->m_cursorTargetGreen);
    else
        SetCursor(gmInstance->m_cursorTargetRed);
    return 0; // prevent DefWndProc from resetting it
}

但是在切换回来时,光标不再被剪辑到我的应用程序窗口的客户区。我尝试检查 WM_ACTIVATEAPP(如下所示)但没有成功,并尝试使用相同的代码和相同的结果检查 WM_ACTIVATE。

case WM_ACTIVATEAPP:
{
    if(wParam == TRUE) // When we are activated
    { 
        if (mIsMouseGrabOn)
            GrabMouse(); // function to determine client area and call ClipCusor with the results
        else
            ClipCusor(NULL); // make the sure cursor is freed
    }
    else if(wParam == FALSE) // When we are deactivated
    {
        ClipCursor(NULL);
    }
    //return 0; // Let DefWndProc handle anything else
}

使用上面的代码,光标会正确更改,但不会被捕获,无论mIsMouseGrabOn.

从应用程序切换回来时,如何正确绑定光标?我应该注意哪些消息而不是 WM_ACTIVATEAPP?

4

2 回答 2

1

您可以观看失去焦点并获得焦点消息

1) WA_ACTIVE 或 WA_CLICKACTIVE - 窗口获得焦点

2) WA_INACTIVE - 窗口失去焦点

如果您的应用程序以全屏模式运行,您应该注意:

3) WM_DISPLAYCHANGE - 当 Windows 改变桌面分辨率时

并调整消息大小

WM_SIZE - 如果 wparam 等于 SIZE_MINIMIZED,SIZE_MAXIMIZED 或 SIZE_RESTORED 你可以剪辑或取消剪辑光标

于 2013-04-11T02:42:03.100 回答
0

WM_SETFOCUS在 Window 接收到键盘焦点后发送,这允许 ClipCursor 工作。

于 2016-07-05T21:09:12.493 回答