Как обнаружить зависание мыши в неклиентской части окна?

avatar
Lucas
9 августа 2021 в 05:14
78
1
0

У меня есть программа, которая рисует в клиентской области с частотой около 60 Гц, используя Direct3D 9, и мышь мешает, поэтому я хочу избавиться от нее только, когда она перемещается по клиентской области.

Я думал, что вызов 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, я не могу начать делать более сложные трюки с наведением мыши.

Источник
xMRi
9 августа 2021 в 05:21
0

Вы должны вызвать TrackMouseEvent после создания окна. Сообщения мыши, не относящиеся к клиенту, всегда появляются перед любыми обычными сообщениями мыши клиента.

Lucas
9 августа 2021 в 05:34
0

Ни в коем случае, я назвал это после создания окна и никакого эффекта. Должен ли я вызывать TrackMouseEvent() только один раз?

IInspectable
9 августа 2021 в 05:55
1

Вероятно, это то, чего вы действительно пытаетесь достичь.

Remy Lebeau
9 августа 2021 в 06:26
0

"мышь мешает" - каким именно образом? Мне кажется, что это проблема XY, и вам следует сосредоточиться на основной проблеме, а не прятать мышь в качестве обходного пути.

Ответы (1)

avatar
xMRi
9 августа 2021 в 05:49
0

Если вы хотите отслеживать WM_NCMOUSEHOVER, вы должны использовать TrackMouseEvent в WM_NCMOUSEMOVE.