Вопрос Клик в не активное окно/WM_LBUTTONDOWN in inactive, unfocused, minimized window

Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2022
Сообщения
8
Реакции[?]
0
Поинты[?]
0
Пишу бота для игры Tower of Fantasty.
Сейчас могу: получать изображение окна, изменять размер и положение окна, отправлять туда нажатие кнопок с клавиатуры.
Чтобы завершить core механики не хватает функции чтобы отправлять клики в окно.
Использую PyWin32, ctypes(user32.dll). Программа должна быть external (если это возможно). Игра для которой делаю бота использует Unreal Engine.
Нажатие клавиш клавиатуры:
from ctypes import windll
import win32con

hwnd = win32gui.FindWindow(None, "Example Window Name")
windll.user32.PostMessageA(hwnd, win32con.WM_KEYDOWN, win32con.VK_SPACE, 0)
Нашел такой код чтобы кликать мышкой. PostMessageA возвращает 1 по документации это значит что сообщение отправлено успешно. Но видимого результата нет.

Нажатие мыши:
from ctypes import windll
import win32con

hwnd = win32gui.FindWindow(None, "Example Window Name")
x,y = (0,0) # doesn't matter
windll.user32.PostMessageA(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, win32api.MAKELONG(x, y)) #return 1
time.sleep(0.001) #try any timings
windll.user32.PostMessageA(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, win32api.MAKELONG(x, y)) #return 1
У этой проблемы есть решение но оно предполагает фокусировку на окне игры. То есть все совершенные пользователем команды будут отправляться в окно, чего мне не нужно
Нажатие мышки с фокусировкой:
from ctypes import windll
import win32con
import win32process
import win32gui
import win32api

hwnd = win32gui.FindWindow(None, "Example Window Name")
x,y = (0,0) # doesn't matter
remote_thread, _ = win32process.GetWindowThreadProcessId(hwnd)
win32process.AttachThreadInput(win32api.GetCurrentThreadId(), remote_thread, True)
win32gui.SetFocus(hwnd)

windll.user32.PostMessageA(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, win32api.MAKELONG(x, y))
time.sleep(0.001)
windll.user32.PostMessageA(hwnd, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, win32api.MAKELONG(x, y))
Моя программа запущена от имени администратора. Я пытался использовать ahk - безуспешно, autoit - безуспешно, pywinauto - не может подключиться к окну.

Подскажите что использовать чтобы бот смог кликать по координатам в окне игры при условии, что игра свернута, не активна, не в фокусе. Хочу external программу чтобы не было проблем с анти читом. Если есть решения на других ЯП с радостью рассмотрю. Если существует только Iternal реализация то хочу увидеть как пойти этим путем.
Если я пришел не на тот форум подскажите где найти инфу по моему вопросу, с stackoverflow меня выгнали тк читы <3
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2022
Сообщения
8
Реакции[?]
0
Поинты[?]
0
Скрытое содержимое
Визуально win32api.SendMessage не работает, если вывести результат будет 0 я так понимаю команда даже не дошла до окна.
Если использовать такие же аргументы как ты написал но юзать windll.user32.PostMessageA вернет 1 но визуально всё ровно не работает.
Координаты в место 0 через win32api.MAKELONG(x, y)? или в этой реализации можно только клик без координат?
Я так понимаю нужно нужно сидеть и подбирать аргументы просто? если так то думаю логично будет использовать/написать какой то дебаггер через которые будет видно какие сообщения отправляются в окно при обычном использовании и повторить их. Но я не знаю где взять такой дебаггер или как его написать.
 
Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,442
Реакции[?]
671
Поинты[?]
30K
А ты уверен, что ты вообще правильные аргументы окна передаешь ?
По тестировал на блокноте хотя б
 
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2022
Сообщения
8
Реакции[?]
0
Поинты[?]
0
А ты уверен, что ты вообще правильные аргументы окна передаешь ?
По тестировал на блокноте хотя б
да правильные, у меня уже работает захват изображения и нажатие кнопок с клавиатуры все через winapi(PyWin32 и user32.dll). Проблема только в мышке. Это звучит очень тупо что windll.user32.PostMessageA(hwnd, win32con.WM_KEYDOWN, win32con.VK_SPACE, 0) работает корректно и в игре происходит прыжок, a при выполнении windll.user32.PostMessageA(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, win32api.MAKELONG(x, y)) клика нет
 
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2022
Сообщения
8
Реакции[?]
0
Поинты[?]
0
UPD: Провел следующий тест: по верх окна с игрой поставил различные окна и отправлял windll.user32.PostMessageA(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, win32api.MAKELONG(x, y)). Так же я расположил курсор мыши так что он находится в другом окне (не игра). Уточнение окно другого приложения было в фокусе ввода активно и не свернуто, в свою очередь игра была не в фокусе, не активна, не свернута. Из этого теста выяснил, что игра действительно получает команду "нажать лкм" но делает это не по заданным мною координатам а там где располагается мышка.

Если я правильно понимаю моя ошибка в win32api.MAKELONG(x, y) или мне нужно какой то другой функцией сначала выставить курсор на координаты а потом нажать ?

На прикрепленном скрине я отметил примерно где был курсор. по синим следам в окне игры понятно что нажатие прошло.
 

Вложения

Начинающий
Статус
Оффлайн
Регистрация
21 Мар 2021
Сообщения
95
Реакции[?]
29
Поинты[?]
7K
Некоторым приложениям и играм свойственно блокировать ввод виртуальной клавиатуры и мышки.
Боюсь, что без фокусировки или драйвера тут не обойтись.
 
Начинающий
Статус
Оффлайн
Регистрация
12 Сен 2022
Сообщения
8
Реакции[?]
0
Поинты[?]
0
Некоторым приложениям и играм свойственно блокировать ввод виртуальной клавиатуры и мышки.
Боюсь, что без фокусировки или драйвера тут не обойтись.
я так понимаю придется создавать прогу на уровне kernel 0 ring?
подскажи где поискать инфу по драйверам вообще и конкретно для моего случая
 
кто читает тот умрет
Участник
Статус
Оффлайн
Регистрация
29 Июл 2019
Сообщения
696
Реакции[?]
540
Поинты[?]
153K
я так понимаю придется создавать прогу на уровне kernel 0 ring?
подскажи где поискать инфу по драйверам вообще и конкретно для моего случая
В разделах на другие игры где без кернела даже посрать нельзя, тот же самый валорант щас забит кучей дохлых драйверов и идиотами которые пытаются их юзать, ну короче готовься к ебле с бсодами, инвалид версией винды, и всдк!!!
 
Сверху Снизу