c++ - 如何在 alt-tab 切换回来后恢复 ClipCursor 收缩

标签 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 的状态如何,光标都会正确更改但不会被捕获。

在离开应用程序并返回时,如何让我的光标正确绑定(bind)?我应该关注哪些消息而不是 WM_ACTIVATEAPP?

最佳答案

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

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

2) WA_INACTIVE - 窗口失去焦点

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

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

并调整消息大小

WM_SIZE - 如果 wparam 等于 SIZE_MINIMIZED、SIZE_MAXIMIZED 或 SIZE_RESTORED,您可以剪切或取消剪切光标

关于c++ - 如何在 alt-tab 切换回来后恢复 ClipCursor 收缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10791439/

相关文章:

c++ - CppUTest 单元测试框架多重定义异常

C++ .dll 在 Visual Studio 中添加 - 另一个 "unresolved external symbol"

c++ - 自动克隆 unique_ptr

javascript - 为什么 Javascript 控件无法在托管 Web 浏览器中加载?

c++ - 发布和调试之间的 ABI 兼容性

c++ - 最小的 boost.org 包含仅使用一个子库

windows - 解密/读取/修改 “.automaticDestinations-ms” 和/或 ".customDestinations-ms"

winapi - 带Windows CryptoUnprotectData的Rust FFI

c++ - 在用户注销时删除 HKEY_CURRENT_USER 值

c++ - 在 Win32 API 中绘制格式化文本的最快方法是什么?