HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 14.01.2025, 19:55
normalped
Познающий
Регистрация: 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
(
)
;


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

Код:





Код:
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(маусы наверное), но шо это - не ясно...
 
Ответить с цитированием

  #2  
Старый 15.01.2025, 21:03
Tectrex
Участник форума
Регистрация: 01.02.2023
Сообщений: 162
С нами: 1728028

Репутация: 48
По умолчанию

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

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

  #3  
Старый 16.01.2025, 00:39
normalped
Познающий
Регистрация: 14.07.2022
Сообщений: 90
С нами: 2018674

Репутация: 18
По умолчанию

Цитата:
Сообщение от Tectrex  

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

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

  #4  
Старый 16.01.2025, 02:08
chromiusj
Флудер
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.