Eu tenho este programa simples do Windows C++ usando a API Win32:
#include <windows.h>
#include <windowsx.h> // GET_Y_LPARAM
#include <string>
#include <iostream>
// clang++ -std=c++23 mouse.cc -o mouse.exe -luser32 -lgdi32
// Handler for WM_MOUSEMOVE
void OnMouseMove(HWND hwnd, int x, int y) {
MOUSEMOVEPOINT inputPoint;
ZeroMemory(&inputPoint, sizeof(inputPoint)) ;
inputPoint.x = x;// & 0x0000FFFF ;
inputPoint.y = y;// & 0x0000FFFF ;
//std::cerr << x << " " << y << std::endl;
//inputPoint.time = GetMessageTime(); // Use the time of the current message
//inputPoint.dwExtraInfo = GetMessageExtraInfo();
MOUSEMOVEPOINT points[64]; // Adjust size based on your needs
int pointsRetrieved = GetMouseMovePointsEx(sizeof(MOUSEMOVEPOINT), &inputPoint, points, 64, GMMP_USE_DISPLAY_POINTS);
if (pointsRetrieved > 0) {
std::cerr << pointsRetrieved << std::endl;
}
else {
//std::cerr << "Error retrieving mouse move points. Error: " << GetLastError() << std::endl;
}
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int MyWindowCreation(HINSTANCE hInstance) {
const char CLASS_NAME[] = "Sample Window Class";
WNDCLASS wc = {};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(
0,
CLASS_NAME,
"Mouse Position Display",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
if (hwnd == NULL) {
return 0;
}
ShowWindow(hwnd, SW_SHOW);
UpdateWindow(hwnd);
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_MOUSEMOVE: {
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
OnMouseMove(hwnd, xPos, yPos);
std::string mousePosition = "X: " + std::to_string(xPos) + ", Y: " + std::to_string(yPos);
SetWindowText(hwnd, mousePosition.c_str());
//OnMouseMove(hwnd, xPos, yPos);
break;
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int main() {
HINSTANCE hInstance = GetModuleHandle(NULL);
MyWindowCreation(hInstance);
return 0;
}
Eu juntei isso para tentar obter dados do mouse usando o arquivo GetMouseMovePointsEx()
. Tentei coisas diferentes, mas continuo recebendo pointsRetrieved = -1
e a mensagem de erro diz que não é possível encontrar os dados do mouse para aquela posição no buffer.
Eu olhei a documentação do MS para esta função . Infelizmente, o código fornecido não pôde ser compilado (não respeita a assinatura da função). Pelo menos esse código é compilado. Tentei com & 0x0000FFFF
e sem ao definir x
e y
, mas não faz diferença. As coordenadas passadas WM_MOUSEMOVE
estão corretas.
Deve ser algo simples!? Será que de alguma forma isso estaria relacionado ao hardware? Quero dizer, talvez em alguma configuração o Windows simplesmente não registre o histórico do mouse? Estou no Windows 10.
Existe uma maneira alternativa e melhor de fazer isso? Este é um método desatualizado?
Isso ocorre porque você está fornecendo as coordenadas erradas para começar.
De acordo com a
GetMouseMovePointsEx()
documentação, ele deseja o ponto de entrada expresso em coordenadas da tela :Mas, em vez disso,
WM_MOUSEMOVE
fornece um ponto do mouse expresso nas coordenadas do cliente :Dentro do seu
WM_MOUSEMOVE
manipulador, você precisa usarClientToScreen()
para converter as coordenadas do cliente fornecidas em coordenadas de tela antes de passá-las paraGetMouseMovePointsEx()
.A
GetMouseMovePointsEx()
documentação ainda diz isso: