PyAutoGui кликает не туда
Вот какая ситуация.
Если изменить разрешение экрана с 1920x1080 на любое другое уже после запуска скрипта, то pyautogui кликает не на те коордиинаты. Например, если изменить разрешение на 1366x768, то вместо x = 940 y = 227 клик будет по координатам x = 755 y = 186. Пример кода:
import pyautogui as pag
pag.click(940, 227)
Однако клик происходит совершенно по другим координатам (скрин ниже).
Проблема в том, что разрешение экрана меняет игра, т.к. в настройках системы указано 1920x1080, а в самой игре: 1366x768. Однако все, что работает с координатам - работает корректно, кроме библиотеки pyautogui. Есть ли какая-нибудь возможность это исправить ?
UPDATE:
Походу я понял, почему pyautogui кликает не туда. Он неправильно определяет разрешение. Вместо 1366x768 он видит почему-то 1708x960
Использовал такой код:
while True:
print(pyautogui.size())
time.sleep(0.5)
Ответы (1 шт):
Покопавшись в pyautogui я выяснил, что текущее разрешение экрана на Windows получается с помощью
ctypes.windll.user32.GetSystemMetrics(0)
и
ctypes.windll.user32.GetSystemMetrics(1)
К сожалению, я так и не понял, почему разрешение, которое определяет ctypes не совпадает с тем, что установлено в игре. Смею предположить, что это может быть из-за разных соотношений сторон у разных разрешений (хоть я и меняю разрешение экрана, однако физически экран у меня не меняется). Однако это не применимо к паре разрешений 1920х1080 и 1366х768, ведь оба этих разрешений имеют соотношение сторон 16:9.
Но все-таки есть решение, которое подошло в моем случае:
import ctypes
import random
import pyautogui as pag
def create_odds(w, h):
# w - заданная мной ширина экрана (игрой)
# h - тоже самое, но с высотой
global windows_w, windows_h
windows_w = ctypes.windll.user32.GetSystemMetrics(0)
windows_h = ctypes.windll.user32.GetSystemMetrics(1)
# windows_w/h - ширина и высота экрана, определенная с помощью ctypes
x_odd = round(windows_w/w, 2)
y_odd = round(windows_h/h, 2)
# создаем коэффициенты разницы между данным мной разрешением и разрешением, полученным с помощью ctypes
x = random.randint(0, 1366)
y = random.randint(0, 768)
# Генерируем случайные координаты для клика
create_odds(1366, 768) # создаем коэффициенты
pag.click(round(x*x_odd), round(y*y_odd))
#Кликаем по координатам с учетом разницы.

