Вверх ↑
Этот топик читают: Гость
Ответов: 1266
Рейтинг: 47
#1: 2024-03-30 20:26:02 ЛС | профиль | цитата
Привет всем, наконец-то заработал форум после долгого перерыва. С чем это связано? Постоянно ошибка сервера 500 писало.
У меня тут проблема неразрешимая нарисовалась, полмесяца бился но так и не смог осилить.
Есть тестовая игра https://gamestracker.org/torrents/pc/action/reload_target_down/15-1-0-7517

Так вот, в ней перестает работать абсолютная адресация мыши для функций Mouse_Event и SendInput и их флаг MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE;
Работает только флаг MOUSEEVENTF_MOVE обеспечивающий относительное перемещение мыши. Вне игры на рабочем столе все работает отлично. Как быть, это невозможно, как я прочел где-то, потому что игра часто обновляет экран и принудительно сама позиционирует курсор и понимает только команды относительного его перемещения или как то это можно побороть? Пока решил кое-как задачу разбитием координат на 100-ки и десятки и единицы пикселов и перемещение последовательное по этим координатам. Но все это более менее работает в винде, притом с погрешностями +- 1-2 пикселя. А в игре тоже работает, но позиции курсора совсем другие из-за того что она меняет разрешение экрана с моих 2560 по ширине до 1280. Но и это еще не все. Функция GetCursorPos в игре показывает позицию 1279 примерно за 2/3 экрана, хотя должна лишь в конце. Вот и думаю, это руки мои с мозгом кривоваты или игру так написали или вообще винда неровная))

Код перемещения такой:


    inp[0].Itype := INPUT_MOUSE;
inp[0].mi.dwFlags := MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE;
inp[0].mi.dx := Round(ScreenWidth * 65535 / ScreenWidth);
inp[0].mi.dy := Round(ScreenHeight * 65535 / ScreenHeight);
SendInput(1, inp[0], SizeOf(TInput));
Sleep(100);
GetCursorPos(P);
// s := 'ClientCords: X:Y '+int2str(P.X) + ':' + int2str(P.Y);
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
vip
#1.1контекстная реклама от партнеров
Ответов: 701
Рейтинг: 146
#2: 2024-04-09 05:30:48 ЛС | профиль | цитата
Aziz писал(а):
Так вот, в ней перестает работать абсолютная адресация мыши для функций Mouse_Event и SendInput и их флаг MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE;
Работает только флаг MOUSEEVENTF_MOVE обеспечивающий относительное перемещение мыши.

Читаем внимательно -https://learn.microsoft.com/ru-ru/windows/win32/learnwin32/dpi-and-device-independent-pixels
карма: 15

0
Ответов: 1266
Рейтинг: 47
#3: 2024-04-09 14:53:41 ЛС | профиль | цитата
Gunta, спасибо, познавательно, но главную задачу абсолютного позиционирования курсора в игре не совсем решает. Там о преобразованиях координат с учетом DPI. Полезная вещь тоже учту.
Но насчет абсолютного мгновенного позиционирования - придется видимо писать что-то на уровне драйвера мыши низкоуровневое.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 4622
Рейтинг: 746
#4: 2024-04-09 20:09:08 ЛС | профиль | цитата
Aziz писал(а):
С чем это связано? Постоянно ошибка сервера 500 писало.

Вроде, место на сервере закончилось.

Вместо INPUT_MOUSE пиши 0 и дай комментарий "В модуле Windows для Delphi 4 перепутали значение константы".
Если сделаешь _debug(INPUT_MOUSE) и запустишь под Delphi и FPC - увидишь разницу.

Редактировалось 1 раз(а), последний 2024-04-09 20:16:30
карма: 26

0
Ответов: 1266
Рейтинг: 47
#5: 2024-04-10 01:04:31 ЛС | профиль | цитата
Netspirit, спасибо, но сделал, не помогло. По крайней мере в той игре. Не двигается курсор. А в винде и с INPUT_MOUSE все прекрасно работает.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 4622
Рейтинг: 746
#6: 2024-04-10 21:15:33 ЛС | профиль | цитата
А, ну эмуляция мыши-клавиатуры в DirectX играх таким образом обычно не будет работать, так как там используется технология DirectInput, а она ближе к железу.
Вроде Rysik плотно таким интересовался, на чем остановился - не знаю.
карма: 26

0
Ответов: 1266
Рейтинг: 47
#7: 2024-04-13 10:31:46 ЛС | профиль | цитата
Netspirit, я тоже надеялся с помощью Direct Input решить эту проблему, но инет в т.ч. англоязычный молчит по поводу управления мышью с ее помощью. Потом понял почему - тоже где то на англ прочел что DI - только для ВВОДА данных от периферии в игру. То есть игра сама опрашивает их и получает данные. Послать вне игры ей сообщение в формате DI невозможно.
Есть сторонке ПО, например Interceptor в виде готового драйвера который как DLL устанавливаешь и потом делаешь с мышью на низком уровне что хочешь, даже в модальных окнах и окнах ввода пароля. Но не пробовал пока да и хочется без сторонних костылей сделать.

Редактировалось 2 раз(а), последний 2024-04-13 10:35:17
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 4622
Рейтинг: 746
#8: 2024-04-13 16:27:58 ЛС | профиль | цитата
Ну, это не совсем костыль. Если игра получает данные от "железа", то надо дать ей "железо".
А поскольку между "железом" и игрой стоит драйвер "железа" - то достаточно дать драйвер "виртуальной мыши", и тогда наличие "железной" мыши игру уже не будет интересовать.
карма: 26

0
Ответов: 1266
Рейтинг: 47
#9: 2024-04-14 12:34:32 ЛС | профиль | цитата
А если игра обрабатывает только относительные перемещения курсора и никак не следит за абсолютными координатами? Как это имеет место быть как я понял в DX играх. Какое железо не подсовывай ей и данные, ее не заставишь переместить свой курсор в произвольную точку мгновенно.
Команды SendInput они могут генерировать
новые координаты для курсора мыши, а драйвер и Direct Input по природе своей не имеют этих механизмов, тк это ведомые логикой игры подпрограммы железа.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 4622
Рейтинг: 746
#10: 2024-04-14 13:32:57 ЛС | профиль | цитата
Именно что относительные - потому что никакого курсора нет.
А есть только событие от драйвера мыши "передвинули на столько единиц по X и Y".
А текущее положение "курсора", а точнее, поля зрения камеры хранится в памяти игры.
Его, вероятно, можно прочитать по принципу программы ArtMoney, но только надо знать где и в каком виде оно хранится. И тогда можно вычислить на сколько и куда двинуть виртуальную мышь.
карма: 26

0
Ответов: 1343
Рейтинг: 31
#11: 2024-04-22 11:09:31 ЛС | профиль | цитата
всё решается двумя простыми путями это SendInput через:


  inp[0].Itype := INPUT_MOUSE;
inp[0].mi.dwFlags := MOUSEEVENTF_MOVE;
inp[0].mi.dx := posx;
inp[0].mi.dy := posy;

либо довольно интересный вариантик это ардуино, реализация по сути такая же, шагами двигаем вместе или отдельно, всё это проверено на многих играх современных, работает как часики)
карма: 2

0
Ответов: 1266
Рейтинг: 47
#12: 2024-04-27 06:19:30 ЛС | профиль | цитата
Rysik, благодарю, но мы с вами (?) в ВК вроде уже пообщались на эту тему.. В вашем коде inp[0].mi.dwFlags := MOUSEEVENTF_MOVE; без флага Absolute значит только относительные перемещения также. У меня точно такой же код только он и работает. Но нужно не рывками мышь перемещать, относительно ее прежнего положения, а мгновенно по нужным координатам.
А насчет всех "железных" решений - не понимаю зачем они и как могут работать лучше софта, если любое железо все равно в конечном итоге требует драйвера и софтовую прослойку. а это значит что можно без него обойтись лишь софтом.. И вообще не понятно, как эти примочки могут сдвинуть курсор мыши в игре, если она слушается лишь своих внутренних команд.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1343
Рейтинг: 31
#13: 2024-04-28 15:21:27 ЛС | профиль | цитата
Aziz писал(а):
Но нужно не рывками мышь перемещать, относительно ее прежнего положения, а мгновенно по нужным координатам.


учитывая что это игра, то это не возможно, там нет абсолютных координат, есть только свои, одно дело в 3D это переводить при помощи W2S в экранные ну и 2D думаю примерно так же, если это стратегия где есть поле которое двигать мышкой можно.

ну и ничего плохого нету двигать шагами, с виду это выглядит как мгновенно, так как обрабатывается в потоке с задержкой в 1мс, а двигать нужно до тех пор пока цель не окажется в координатах мышки (если игра захватывает мышку то это центр экрана), а когда окажется то при обработке координат через w2s благодаря матрице проекции, экранные координаты окажутся в центре и после просто функция движения будет принимать шаг 0 и бездействовать, ну тоесть классический аим

Редактировалось 1 раз(а), последний 2024-04-28 15:23:47
карма: 2

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)