У меня есть программа, которая рисует в клиентской области с частотой около 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
, я не могу начать делать более сложные трюки с наведением мыши.
Вы должны вызвать TrackMouseEvent после создания окна. Сообщения мыши, не относящиеся к клиенту, всегда появляются перед любыми обычными сообщениями мыши клиента.
Ни в коем случае, я назвал это после создания окна и никакого эффекта. Должен ли я вызывать TrackMouseEvent() только один раз?
Вероятно, это то, чего вы действительно пытаетесь достичь.
"мышь мешает" - каким именно образом? Мне кажется, что это проблема XY, и вам следует сосредоточиться на основной проблеме, а не прятать мышь в качестве обходного пути.