首页 > 解决方案 > 如何检测鼠标悬停在窗口的非客户端部分?

问题描述

我有一个使用 Direct3D 9 绘制到大约 60hz 的客户区的程序,并且鼠标正在干扰,所以我只想在它穿过客户区时摆脱它。

我认为系统调用ShowCursor(false)时调用WM_MOUSEMOVE和调用ShowCursor(true)WM_NCMOUSEMOVE起作用,但这会导致行为不佳。

所以我发现这TrackMouseEvent()可以完成这项工作,但我用以下方式调用它:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static bool g_fMouseTracking = false;
    switch (message)
    {
    case WM_MOUSEMOVE:
        if (!g_fMouseTracking)
        {
            TRACKMOUSEEVENT tme;
            tme.cbSize = sizeof(tme);
            tme.dwFlags = TME_NONCLIENT;
            tme.dwHoverTime = HOVER_DEFAULT;
            tme.hwndTrack = hWnd;
            g_fMouseTracking = TrackMouseEvent(&tme);
         }
     break;
     case WM_NCMOUSEHOVER:
         ShowCursor(true);
         break;
    ... 

并且WM_NCMOUSEHOVER永远不会被调用。我不知道为什么。

无论如何,这只是一段代码,做我想做的事我知道我需要更多的代码,但如果它没有调用WM_NCMOUSEMOVE我就不能开始做更高级的鼠标悬停技巧。

标签: winapimouse

解决方案


当您要跟踪时,WM_NCMOUSEHOVER您必须使用TrackMouseEventin WM_NCMOUSEMOVE


推荐阅读