Итак, я делаю игру в C++ с OpenGL, и я хочу, чтобы мой курсор оставался посередине экрана.
В начале каждого кадра я вызываю
POINT pt;
pt.x = 400;
pt.y = 300;
ClientToScreen(hWnd, &pt);
SetCursorPos(pt.x, pt.y);
Затем, на мероприятии WM_MOUSEMOVE, которое я делаю
POINT p;
GetCursorPos(&p);
ScreenToClient(hWnd, &p);
dx = p.x - 400;
dy = p.y - 300;
Окно размером 800x600, поэтому я просто написал эти цифры, которые, очевидно, будут изменены позже.
Он работает, но он очень неряшлив. Как если бы некоторые кадры были сброшены.
Вы можете использовать ClipCursor()
чтобы ограничить движение мыши. Мышь не сможет перемещаться за пределы указанного прямоугольника, пока вы его не отпустите.
SetCapture()
для получения сообщений мыши, таких как WM_MOUSEMOVE
и WM_LBUTTONUP
, даже когда мышь находится за пределами вашего окна. Или просто забудьте ClipCursor()
и используйте SetCapture()
, чтобы у пользователя было больше возможностей для свободного перемещения. В любом случае, захватите мышь, когда левая кнопка удерживается на вашем окне, затем отпустите захват, когда кнопка будет отпущена. Вы можете вычислить дельты на основе перемещений между сообщениями или расстояния между координатами сообщения мыши и координатами вашего окна.
Вы можете попробовать установить крючок через SetWindowsHookEx
(передавая WH_MOUSE
или, возможно, даже WH_MOUSE_LL
), и просто отбрасывать все события перемещения до отправки соответствующих сообщений окна.