Это приводило к сбою приложения. С тех пор я исправил проблему и объяснил ее тем, что при вызове функции обратного вызова перемещения мыши она вызывает TrackMouseEvent(). Я подозреваю, что приложение начинает отслеживать положение мыши за пределами клиентской области, и иногда событие WM_MOUSEMOVE отправляется перед событием WM_MOUSELEAVE — следовательно, координаты мыши находятся за пределами клиентского прямоугольника.
Код: Выделить всё
void track_mouse_events(..., DWORD track_mouse_event_flag) {
if (active_mouse_tracking_flag == 0) {
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.dwFlags = track_mouse_event_flag;
tme.hwndTrack = hwnd;
tme.dwHoverTime = 0;
TrackMouseEvent(&tme);
active_mouse_tracking_flag = track_mouse_event_flag;
}
}
int OnMouseMove(..., UINT uMsg, WPARAM wParam, LPARAM lParam) {
// Sometimes we get mouse coordinates outside the client area bounds
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
// Workaround for invalid mouse coordinates
// if (!mouse_in_client(hwnd, lParam, &x, &y))
// return 0;
track_mouse_events(..., TME_LEAVE);
...
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... outside-of
Мобильная версия