如何在alt-tab切换后返回时恢复ClipCursor收缩

时间:2012-05-28 23:24:53

标签: c++ winapi

我正在尝试将鼠标指针(使用自定义光标)限制到我的应用程序窗口的客户区域,该应用程序最初有效,但当我从应用程序切换回来时遇到问题。我正在使用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?

2 个答案:

答案 0 :(得分:1)

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

1)WA_ACTIVE或WA_CLICKACTIVE - 窗口得到了重点

2)WA_INACTIVE - 窗口失去焦点

你应该看看你的应用是否以全屏模式运行:

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

并调整消息大小

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

答案 1 :(得分:0)

在窗口接收键盘焦点后发送

WM_SETFOCUS,这允许ClipCursor工作。