我试图将鼠标指针(使用自定义光标)限制在我的应用程序窗口的客户区,该应用程序最初可以正常工作,但当我离开应用程序并返回时遇到问题。我正在使用 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/