延迟在客户区隐藏鼠标光标?

Hide mouse cursor in client area with delay?

我正在用 C 编写 Windows 应用程序。

我通过处理 WM_SETCURSOR 消息将鼠标光标隐藏在 window 的客户区:

    case WM_SETCURSOR:
    {
        static BOOL HideCursor = FALSE;
        if ((LOWORD(LParam) == HTCLIENT) && !HideCursor)
        {
            HideCursor = TRUE;
            ShowCursor(FALSE);
        }
        else if ((LOWORD(LParam) != HTCLIENT) && HideCursor)
        {
            HideCursor = FALSE;
            ShowCursor(TRUE);
        }
        Result = DefWindowProc(Window, Message, WParam, LParam);
        break;
    }

这很好用,但有点尴尬,因为鼠标光标一进入 window 的客户区就会立即消失。例如,当用户试图将光标移向工具栏按钮或手动调整 window 的大小时,用户很容易忘记鼠标光标 "should be" 的位置。

如何在其中添加一两秒的延迟,以便用户可以将鼠标移到 window 的客户区上,而鼠标不会立即消失,但是如果鼠标光标悬停在 window客户区超过一两秒,就消失了?

当通知您鼠标光标进入 window 时,您可以使用 SetTimer(hWnd, ID_MOUSE_TIMER, 2000, NULL),其中 hWnd 是您的 window 句柄,ID_MOUSE_TIMER 是一个定时器的任意标识符,用于创建一个将在 2000 毫秒后触发的定时器。

然后您可以像以前一样回复 WM_TIMER 消息并隐藏光标,还可以使用 KillTimer(hWnd, ID_MOUSE_TIMER) 来防止进一步调用。

当鼠标光标离开您的 window 时,您还应该销毁计时器,如果鼠标光标像之前一样被隐藏,则还应恢复其可见性。

要阅读有关计时器的信息,请查看 MSDN 中相应的 section

您可以使用 WM_MOUSEHOVER 消息。