Приветствую! Пытаюсь изменить позицию мыши через с++ на 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(маусы наверное), но шо это - не ясно...