Перемещение указателя в игре
Как переместить курсор в известную мне точку в стороннем приложении?
SetCursorPos() не предлагать, т.к. приложение имеет самостоятельный курсор (даже при простом сворачивании-разворачивании обычный курсор смещается относительно курсора в приложении). Ну кто играл в crimsonland или teeworlds меня поймет. В итоге при попытке воспользоваться SetCursorPos() курсор приложения ведет себя крайне неадекватно, ну т.е. или вообще не двигается, или уезжает не туда.
Ну это надо спросить разработчиков приложения, как двигать ИХ курсор. Здесь, к сожалению, тебе вряд-ли помогут.
как вариант послать сообщение wm_mousemove, wm_nchittest
Координаты реального курсора, как оказалось, приложение всегда сохраняет равными координатам центра своего окна, а курсор приложения перемещается вот каким образом.
Когда пользователь двигает мышку, то приложение сравнивает текущие координаты курсора с координатами центра окна, смещает курсор приложения на полученную величину смещения win курсора, а сам win курсор возвращает обратно в центр окна.
Таким образом получается что GetCursorPos дает нам координаты win курсора, а не курсора приложения (которые нам какраз и надо). А для смещения курсора приложения с помощью SetCursorPos, нам необходимо знать координаты целевой точки относительно координат курсора приложения, и передать в SetCursorPos текущие координаты win курсора + приращение (которое и есть те самые относительные координаты, причем еще и ограничение на максимальное приращение есть, равное 395 пикселам, т.е. если надо добраться из точки (0, 0) в точку (500, 500) приходится делать два смещения курсора, cначала на (cursorpos.X + 395, cursorpos.Y + 395), а потом еще на (cursorpos.X + 105, cursorpos.Y + 105)).
Но я не знаю как мне узнать координаты курсора приложения. По всей видимости - никак, ну разве что дергать координаты прямо из приложения, но я данную задачу навряд-ли осилю.
Была идея заведомо обнулять координаты курсора приложения, давая смещение win курсору таким образом, чтобы курсор приложения в любом случае оказывался в верхнем левом углу, а уже потом, зная что исходные координаты (0, 0) смещать его в нужную точку. Но опять возникла проблема, видимо смещение курсора в приложении повешено не на событие, а организовано периодическим сравнением координат win курсора с эталонными (центром окна) через малые промежутки времени. В связи с этим, нельзя сделать искусственное перемещение курсора (ну со стороны моей программы) одним махом, приходится вставлять интервал времени между смещениями, что в итоге приводит к относительно медленному ступенчатому смещению.
Вот сижу и думаю, как еще можно организовать движение курсора, видимо никак :(