Это приводило к сбою приложения. С тех пор я исправил проблему и объяснил ее тем, что при вызове функции обратного вызова перемещения мыши она вызывает 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);
...
}
Изменить: вопрос связан с тем фактом, что событие WM_MOUSEMOVE, по-видимому, генерируется до события WM_MOUSELEAVE (причина, по которой мышь отслеживается, заключается в том, что приложение прослушивает события WM_MOUSELEAVE). Таким образом, даже несмотря на то, что событие WM_MOUSELEAVE генерируется, когда мышь покидает окно, Windows не гарантирует, что это событие будет отправлено до отправки события WM_MOUSEMOVE, что, как я думал, могло иметь место.
Подробнее здесь: https://stackoverflow.com/questions/798 ... outside-of
Мобильная версия