Возможно ли, что lParam в WM_MOUSEMOVE иногда содержит координаты мыши за пределами клиентской области?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Возможно ли, что lParam в WM_MOUSEMOVE иногда содержит координаты мыши за пределами клиентской области?

Сообщение Anonymous »

У меня есть приложение WinAPI (Win 10) C++, которое использует окно Windows, фиксирующее событие WM_MOUSEMOVE. Я заметил, что в редких случаях координаты мыши немного выходят за пределы клиентской области — например, значения x или y мыши могут быть меньше 0 или больше или равны правой и нижней границам клиентского прямоугольника.
Это приводило к сбою приложения. С тех пор я исправил проблему и объяснил ее тем, что при вызове функции обратного вызова перемещения мыши она вызывает 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);

...
}
Я хотел бы знать, действительно ли это возможное поведение Windows, или я делаю что-то принципиально неправильное.
Изменить: вопрос связан с тем фактом, что событие WM_MOUSEMOVE, по-видимому, генерируется до события WM_MOUSELEAVE (причина, по которой мышь отслеживается, заключается в том, что приложение прослушивает события WM_MOUSELEAVE). Таким образом, даже несмотря на то, что событие WM_MOUSELEAVE генерируется, когда мышь покидает окно, Windows не гарантирует, что это событие будет отправлено до отправки события WM_MOUSEMOVE, что, как я думал, могло иметь место.

Подробнее здесь: https://stackoverflow.com/questions/798 ... outside-of
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»