Это приводило к сбою приложения. С тех пор я исправил проблему и объяснил ее тем, что при вызове функции обратного вызова перемещения мыши она вызывает 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]
Мобильная версия