 |

14.01.2025, 19:55
|
|
Познающий
Регистрация: 14.07.2022
Сообщений: 90
С нами:
2018674
Репутация:
18
|
|
Приветствую! Пытаюсь изменить позицию мыши через с++ на 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
(
)
;
Я получу в консоли это "чудо" (вообще не то, на что я расчитывал):
Код:
Копаясь в интернете я нашел якобы решение, но оно не совсем спасает. Можно изменить код:
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(маусы наверное), но шо это - не ясно...
|
|
|

15.01.2025, 21:03
|
|
Участник форума
Регистрация: 01.02.2023
Сообщений: 162
С нами:
1728028
Репутация:
48
|
|
Используешь SendInput и усё.
Если нужно точное позиционирование, берешь MOUSEEVENTF_ABSOLUTE и конвертируешь координаты в диапазон 0-65535. Но игры могут это игнорить, так что для них лучше MOUSEEVENTF_MOVE относительное перемещение. Только учти, что координаты там в "миках" как ты выразился в маусах)), а не в пикселях, поэтому точность может хромать, особенно если двигаешь по двум осям сразу. Если хочешь больше контроля, то хуки через SetWindowsHookEx. Ты можешь перехватывать события мыши и менять их.
|
|
|

16.01.2025, 00:39
|
|
Познающий
Регистрация: 14.07.2022
Сообщений: 90
С нами:
2018674
Репутация:
18
|
|
Сообщение от Tectrex
Используешь SendInput и усё.
Если нужно точное позиционирование, берешь MOUSEEVENTF_ABSOLUTE и конвертируешь координаты в диапазон 0-65535. Но игры могут это игнорить, так что для них лучше MOUSEEVENTF_MOVE относительное перемещение. Только учти, что координаты там в "миках" как ты выразился в маусах)), а не в пикселях, поэтому точность может хромать, особенно если двигаешь по двум осям сразу. Если хочешь больше контроля, то хуки через SetWindowsHookEx. Ты можешь перехватывать события мыши и менять их.
Так а шо это за мики? Правильно ли я их вычислял?
|
|
|

16.01.2025, 02:08
|
|
Флудер
Регистрация: 10.08.2021
Сообщений: 6,010
С нами:
2505538
Репутация:
133
|
|
Сообщение от normalped
Так а шо это за мики? Правильно ли я их вычислял?
What is Mickey?
Computer dictionary definition for what mickey means including related links, information, and terms.
www.computerhope.com
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|