Возможно ли, что 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 — следовательно, координаты мыши находятся за пределами клиентского прямоугольника.
РЕДАКТИРОВАТЬ
Я добавил воспроизводимый случай для каждого запроса комментария:

Код: Выделить всё

// clang mouse_move_event_test.c -luser32

#include 
#include 
#include 

#ifndef GET_X_LPARAM
#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
#endif
#ifndef GET_Y_LPARAM
#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
#endif

static bool tracking = false;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_MOUSEMOVE: {
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);

printf("WM_MOUSEMOVE x: %d y: %d\n", x, y);
fflush(stdout);

RECT client;
GetClientRect(hwnd, &client);
if (x < client.left || y < client.top || x >= client.right || y >= client.bottom) {
printf("\033[031mWM_MOUSEMOVE x: %d y: %d, rect %ld %ld %ld %ld 

Подробнее здесь: [url]https://stackoverflow.com/questions/79808842/is-it-possible-that-lparam-on-wm-mousemove-contains-mouse-coordinates-outside-of[/url]

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