PDA

Просмотр полной версии : Изменение позиции мыши C++ (с поддержкой игр)


normalped
14.01.2025, 19:55
Приветствую! Пытаюсь изменить позицию мыши через с++ на windows, способ должен поддерживать игры. Я нашел два способа:

1. Работает отлично, но mouse_event считается устаревшим методом.

C++:






static
void
move
(
int
x
,
int
y
)
{
// Абсолютное позиционированние
int
ax
=
(
x
*
65536
)
/
GetSystemMetrics
(
0
)
;
int
ay
=
(
y
*
65536
)
/
GetSystemMetrics
(
1
)
;
mouse_event
(
MOUSEEVENTF_MOVE
|
MOUSEEVENTF_ABSOLUTE
,
ax
,
ay
,
0
,
0
)
;
}




2. Работает буд-то под нехилой дозой изменяя позицию вообще непонятно как.

C++:






static
void
input
(
int
x
,
int
y
)
{
// Относительное позиционированние
INPUT input
;
input
.
type
=
INPUT_MOUSE
;
input
.
mi
.
dx
=
x
;
input
.
mi
.
dy
=
y
;
input
.
mi
.
dwFlags
=
MOUSEEVENTF_MOVE
;
SendInput
(
1
,
&
input
,
sizeof
(
input
)
)
;
}




Кому интересно как я получаю позицию:

C++:






static
POINT
position
(
)
{
SetProcessDPIAware
(
)
;
POINT pos
;
GetCursorPos
(
&
pos
)
;
return
pos
;
}




Допустим если выполнить:

C++:






pos
(
)
;
// Выводит в консоль позицию
Mouse
::
input
(
100
,
0
)
;
pos
(
)
;




Я получу в консоли это "чудо" (вообще не то, на что я расчитывал):

Код:






805 55
1012 55




Копаясь в интернете я нашел якобы решение, но оно не совсем спасает. Можно изменить код:

C++:






input
.
mi
.
dx
=
(
x
/
1920.0
)
*
1080
;
// Было просто x
input
.
mi
.
dy
=
(
y
/
1920.0
)
*
1080
;
// Было просто y




Теперь все куда точнее, но бывают моменты, когда разница составляет 10+ пикселей, это не дело. Но такое поведение характерно тем моментам, когда изменяются две оси, если только одна (например

Mouse::input(100, 0);

) - все работает нормально, то есть мышь реально переместится четко на 100 пикселей вправо.

Еще можно добавить флаг MOUSEEVENTF_ABSOLUTE к MOUSEEVENTF_MOVE, но тогда в играх работать ничего не будет.

Такое поведение второго способа мне не нравится, надо шо то с ним делать. Я уже перелазил весь интернет и ничего толком не нашел под мой случай. Буду благодарен вашим предложениям!

UPD: Во втором способе используются не пиксели, а какие то mickey (https://www.blast.hk/redirect/aHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL3dpbm Rvd3Mvd2luMzIvYXBpL3dpbnVzZXIvbmYtd2ludXNlci1tb3Vz ZV9ldmVudA)(маусы наверное), но шо это - не ясно...

Tectrex
15.01.2025, 21:03
Используешь SendInput и усё.

Если нужно точное позиционирование, берешь MOUSEEVENTF_ABSOLUTE и конвертируешь координаты в диапазон 0-65535. Но игры могут это игнорить, так что для них лучше MOUSEEVENTF_MOVE относительное перемещение. Только учти, что координаты там в "миках" как ты выразился в маусах)), а не в пикселях, поэтому точность может хромать, особенно если двигаешь по двум осям сразу. Если хочешь больше контроля, то хуки через SetWindowsHookEx. Ты можешь перехватывать события мыши и менять их.

normalped
16.01.2025, 00:39
Используешь SendInput и усё.

Если нужно точное позиционирование, берешь MOUSEEVENTF_ABSOLUTE и конвертируешь координаты в диапазон 0-65535. Но игры могут это игнорить, так что для них лучше MOUSEEVENTF_MOVE относительное перемещение. Только учти, что координаты там в "миках" как ты выразился в маусах)), а не в пикселях, поэтому точность может хромать, особенно если двигаешь по двум осям сразу. Если хочешь больше контроля, то хуки через SetWindowsHookEx. Ты можешь перехватывать события мыши и менять их.


Так а шо это за мики? Правильно ли я их вычислял?

chromiusj
16.01.2025, 02:08
Так а шо это за мики? Правильно ли я их вычислял?



What is Mickey? (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cuY29tcHV0ZXJob3BlLmNvbS9qYXJnb24vbS 9taWNrZXkuaHRt)

Computer dictionary definition for what mickey means including related links, information, and terms.

www.computerhope.com