ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Изменение позиции мыши C++ (с поддержкой игр) (https://forum.antichat.xyz/showthread.php?t=1529284)

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(маусы наверное), но шо это - не ясно...

Tectrex 15.01.2025 21:03

Используешь SendInput и усё.

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

normalped 16.01.2025 00:39

Цитата:

Сообщение от Tectrex

Используешь SendInput и усё.

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

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

chromiusj 16.01.2025 02:08

Цитата:

Сообщение от normalped

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

What is Mickey?

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

www.computerhope.com


Время: 23:58