Возможно ли, что 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]
Ответить

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

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

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

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

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