Вопрос по скрипта Python

Написал программу для ГТА 5 которая должна управлять транспортом по мини карте заставил скрипт распознавать фиолетовую метку на экране и на основе этого дал команду ехать по метке, но столкнулся с проблемой того что когда я захожу в ГТА и оно видит метку скрипт срабатывает и начинает нажимать W чтобы ехать вперёд, но нажимает оно его на рабочем столе, из-за чего происходит страшная вакханалия, нужен совет как сделать чтобы оно видело ГТА и кликало именно в ней, разрешения экрана 1920 X 1080, или может кто-то поможет с фиксом данной проблемы вот код

import pyautogui
import keyboard
import win32gui
import win32con

# Переменная для хранения состояния скрипта
script_enabled = False

# Функция для получения идентификатора окна GTA 5
def get_gta_window():
    return win32gui.FindWindow(None, "Grand Theft Auto V")  # "Grand Theft Auto V" - это заголовок окна GTA 5

# Функция для активации окна GTA 5
def activate_gta_window(hwnd):
    win32gui.ShowWindow(hwnd, win32con.SW_RESTORE)
    win32gui.SetForegroundWindow(hwnd)

# Захват экрана
def capture_screen():
    screenshot = pyautogui.screenshot(region=(0, 0, 1920, 1080))
    frame = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
    return frame

# Распознавание метки на мини-карте
def detect_marker(image):
    # Преобразуем изображение в цветовое пространство HSV
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    
    # Определяем нижний и верхний порог для фиолетового цвета (в HSV)
    lower_purple = np.array([130, 50, 50])
    upper_purple = np.array([170, 255, 255])
    
    # Создаем маску для фиолетового цвета
    mask = cv2.inRange(hsv, lower_purple, upper_purple)
    
    # Находим контуры объектов на изображении
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    
    # Если найден хотя бы один контур, считаем его меткой и возвращаем его координаты
    if contours:
        c = max(contours, key=cv2.contourArea)
        x, y, w, h = cv2.boundingRect(c)
        marker_x = x + w // 2
        marker_y = y + h // 2
        
        return marker_x, marker_y
    else:
        return None, None

# Управление нажатиями клавиш
def control_character(marker_x, marker_y):
    character_x, character_y = 960, 540  # Предположим, что центр экрана - это положение персонажа
    
    if marker_x is not None and marker_y is not None:
        print(f"Метка обнаружена. Координаты: x={marker_x}, y={marker_y}")
        
        if marker_x > character_x:
            pyautogui.keyDown('d')
        elif marker_x < character_x:
            pyautogui.keyDown('a')
        if marker_y > character_y:
            pyautogui.keyDown('s')
        elif marker_y < character_y:
            pyautogui.keyDown('w')
    else:
        print("Метка не обнаружена")
        # Если метка не обнаружена, отпускаем все клавиши
        pyautogui.keyUp('w')
        pyautogui.keyUp('a')
        pyautogui.keyUp('s')
        pyautogui.keyUp('d')

# Функция для обработки нажатия клавиши F4
def toggle_script():
    global script_enabled
    script_enabled = not script_enabled
    print(f"Скрипт {'включен' if script_enabled else 'выключен'}")

# Основной цикл программы
while True:
    if script_enabled:
        gta_window = get_gta_window()
        if gta_window:
            activate_gta_window(gta_window)
            frame = capture_screen()
            marker_x, marker_y = detect_marker(frame)
            control_character(marker_x, marker_y)
        else:
            print("Окно GTA 5 не найдено.")
        
    # Проверяем нажатие клавиши F4 и переключаем состояние скрипта
    if keyboard.is_pressed('f4'):
        toggle_script()
        # Ждем, пока клавиша F4 будет отпущена, чтобы избежать повторных переключений
        while keyboard.is_pressed('f4'):
            pass```

Ответы (0 шт):