1 (изменено: haridev, 2025-11-16 18:26:28)

Тема: AHK v2: Превосходство AHK

Попросил у ИИ (GigaChat)
код на языке python, который 1) сохраняет сохранённую ранее игру паук из игры паук по клавише ctrl+S в месте, отличном от стандартного места сохранения игры паук; 2) сохраняет текущее состояние игры паук (окна игры паук) по месту стандартного сохранения игры паук.

Ответ.

Реализовать такое поведение исключительно средствами Python сложно по нескольким причинам:

Стандартная версия игры «Паук» является частью предустановленных приложений Windows и работает нативно в среде ОС. Это значит, что доступ к сохранению напрямую зависит от внутренней структуры приложения, а обычные скрипты Python не смогут легко вмешиваться в процесс работы такого приложения.
Сохранять состояние окна программы также непросто, поскольку стандартные инструменты Python не позволяют управлять окнами приложений таким способом (за исключением специализированных библиотек вроде PyWinAuto или pyautogui, которые всё равно требуют определённых условий).
Однако мы можем создать сценарий, использующий горячие клавиши для отправки команд приложению «Паук». Этот способ подразумевает эмуляцию нажатия клавиш через API Windows. Давайте рассмотрим пошагово реализацию вашего сценария.

Шаги реализации:
Часть 1: Запись в альтернативное место при нажатии Ctrl + S
Здесь мы перехватим событие сочетания клавиш и отправим команду сохранения в нестандартное место. Однако такая реализация требует вмешательства на уровне интерфейсов самого приложения «Паук», которое технически невозможно осуществить только силами Python. Поэтому эта задача невыполнима классическим способом.

Часть 2: Сохранение текущего состояния игры по стандартной схеме
Мы можем попробовать имитировать стандартный механизм сохранения через клавиатуру. Обычно в игре предусмотрена комбинация клавиш (например, Ctrl + S). Но тут возникает проблема: игра сама должна поддерживать такую функциональность, иначе никакие манипуляции Python не помогут.

Тем не менее, вот как можно организовать автоматическое выполнение команды сохранения в игре с использованием библиотеки pyautogui, которая позволяет отправлять события клавиатуры приложениям:


import pyautogui
import time

# Задержка перед запуском
print("Программа запустится через 5 секунд... Поднесите фокус к окну игры.")
time.sleep(5)

# Отправляем комбинацию клавиш Ctrl + S для инициирования сохранения
pyautogui.hotkey('ctrl', 's')

print("Команда сохранения выполнена.")
Этот скрипт просто пошлет комбинации клавиш "Ctrl + S" в активное окно (предполагается, что окно игры активно в момент выполнения скрипта).

Ограничения подхода:
Метод с эмуляцией нажатия клавиш сработает лишь тогда, когда приложение поддерживает данную комбинацию клавиш для сохранения.
Управление окном игры и взаимодействием с элементами окна напрямую практически невозможно реализовать без специальных расширенных методов автоматизации оконных элементов (таких как UI Automation Framework).
Альтернативное решение:
Единственный надежный способ добиться полного контроля над процессом сохранения заключается в модификации исходного кода игры либо написании своего собственного игрового клиента, поддерживающего необходимую функциональность.

Итак, полная реализация ваших требований (создание отдельной области хранения и управление состоянием окна) невозможна без изменения поведения самой игры. Вы можете рассмотреть вариант написания собственной версии игры с нужными функциями или искать готовое решение среди модификаций или аналогов игры «Паук».

-----------------
Решение средствами AHK.

; сделать копию сохранённой игры Паук и сохранить текущую
; либо восстановить игру из копии
SaveDir1 := "d:\Мои документы\"
SaveDir2 := "d:\Portable\"
SpiderSav := "spider.sav"
WT_Spider := 'Пасьянс "Паук"'
WT_Confirm := "ahk_class #32770"
if !WinExist(WT_Spider)
	ExitApp
if A_Args.Length {	; восстановить
	try FileCopy SaveDir2 SpiderSav, SaveDir1, true
	catch as e {
		MsgBox e.Message
		ExitApp
	}
	WinActivate WT_Spider
	send "^o"
} else {	; сохранить
	try FileMove SaveDir1 SpiderSav, SaveDir2, true
	catch as e {
		MsgBox e.Message
		ExitApp
	}
	WinActivate WT_Spider
	send "^s"
}
if !WinWait(WT_Confirm,, 3)
	MsgBox 'Нет окна подтверждения'
else ControlClick "Button1", WT_Confirm
ExitApp

2

Re: AHK v2: Превосходство AHK

Я не совсем понял, в чём суть поста. Но всё же оформите пожалуйста код, как положено.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK v2: Превосходство AHK

teadrinker
Цель поста - показать превосходство AHK над PYTHON

4

Re: AHK v2: Превосходство AHK

По-моему, звучит слишком громко. Превосходство только в том, что у Python вроде нет встроенных средств для отправки клавиш. Всё, что можно сделать на AHK, можно и на Python, используя библиотеки.
А что касается первой части вашего поста (общение с GigaChat на тему кодинга) — можете смело её удалить, вы просто выбрали неверный инструмент.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: haridev, 2025-11-16 19:34:23)

Re: AHK v2: Превосходство AHK

Так именно, что используя библиотеки. Их надо найти ещё нужные, в окольной документации. В питоне нет нативных средств для работы с окнами Windows. AHK даёт простое и эффективное решение встроенными средствами востребованного круга задач.
Что касается негодного инструмента, покажите решение годным инструментом, чтобы можно было сравнить.

6

Re: AHK v2: Превосходство AHK

Так это философия программирование на Питоне — использование библиотек.

haridev пишет:

востребованного круга задач

Ну да, это смотря, какие задачи востребованы. Если отправка клавиш, тогда проще использовать AHK, а если обучение нейросетей, то Питон. Мне сдаётся, что последнее сейчас более востребовано.

haridev пишет:

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

Я даже не знаю о существовании игры "паук", не стану с этим заморачиваться. Но уверен, что даже Дипсик с подобной задачей справится, если написать верный промпт (скопировать файлы и отправить клавиши).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: Malcev, 2025-11-18 11:33:49)

Re: AHK v2: Превосходство AHK

haridev пишет:

используя библиотеки. Их надо найти ещё нужные, в окольной документации

ИИ подскажет, какие библиотеки использовать.

haridev пишет:

Управление окном игры и взаимодействием с элементами окна напрямую практически невозможно реализовать без специальных расширенных методов автоматизации оконных элементов (таких как UI Automation Framework).

Автохотки тоже нативно это не поддерживает.
В принципе автохотки бейсик был написан на основе окрытого кода автоита, после чего авторы автоита обиделись, переписали код и закрыли исходники.
Потом Lexikos переписал код автохотки бейсик, назвал Ahk-L и помимо улучшений структуры кода и прочих новшеств, добавил много чего для автоматизации и более-менее сохранил обратную совместимость.
На что автор автохотки Chris Mallett отреагировал негативно, типа нафиг все это надо и умыл руки.
Потом Lexikos писал много лет autohotkey v2, таки дописал, убрал полностью обратную совместимость с ahk v1, но не добавил ничего нового в плане автоматизации.
Ни одного фреймворка.
То есть, столько лет потратить на создание второй версии, убрать полностью обратную совместимость с библиотеками, написанными за все эти 20 лет, и не добавить ничего нового в плане автоматизации.
Ну такое...

8

Re: AHK v2: Превосходство AHK

Попросил GigaChat перевести с AHK на Python. Не проверял, но выглядит правдоподобно

import os
import shutil
from pyautogui import hotkey, alert
import time

# Настройки путей и переменных
save_dir1 = r'd:\Мои документы\\'   # Обратите внимание на двойной слеш
save_dir2 = r'd:\Portable\\'
spider_sav = 'spider.sav'
window_title_spider = 'Пасьянс "Паук"'
window_title_confirm = '#32770'     # Класс окна диалогового окна подтверждения Windows

def main():
    if not window_exists(window_title_spider):
        print("Окно приложения Пасьянс \"Паук\" не найдено.")
        return

    args_length = len(os.sys.argv)-1
    
    try:
        if args_length > 0:          # Восстанавливаем игру
            shutil.copy(save_dir2 + spider_sav, save_dir1 + spider_sav)
            activate_window_and_send_keys(window_title_spider, '^o')
        else:                        # Сохраняем игру
            shutil.move(save_dir1 + spider_sav, save_dir2 + spider_sav)
            activate_window_and_send_keys(window_title_spider, '^s')
        
        wait_for_confirmation()
    except Exception as e:
        alert(str(e))

def window_exists(title):
    """Проверка существования окна"""
    from win32gui import FindWindowEx
    hwnd = FindWindowEx(None, None, None, title)
    return bool(hwnd)

def activate_window_and_send_keys(title, key_sequence):
    """Активирует окно и отправляет последовательность клавиш"""
    from win32gui import SetForegroundWindow, GetForegroundWindow
    from win32con import SW_SHOWNOACTIVATE
    from win32api import SendMessageTimeout
    from win32gui import EnumWindows, IsWindowVisible, IsWindowEnabled
    
    def find_window_by_title(title):
        hwnd = None
        def callback(hwnd_, _):
            nonlocal hwnd
            if IsWindowVisible(hwnd_) and IsWindowEnabled(hwnd_) and title in win32gui.GetWindowText(hwnd_):
                hwnd = hwnd_
        EnumWindows(callback, None)
        return hwnd
    
    hwnd = find_window_by_title(title)
    if hwnd is None or not hwnd:
        raise RuntimeError(f"Не удалось найти окно с заголовком '{title}'")
    
    # Активируем окно
    SetForegroundWindow(hwnd)
    # Отправляем горячую комбинацию клавиш
    hotkey(*key_sequence.split('+'))

def wait_for_confirmation(timeout=3):
    """Ожидает появления окна подтверждения и нажимает первую кнопку"""
    from win32gui import FindWindowEx
    from win32api import PostMessage
    from win32con import WM_LBUTTONDOWN, WM_LBUTTONUP, MK_LBUTTON
    
    for i in range(int(timeout*10)):
        confirm_hwnd = FindWindowEx(None, None, window_title_confirm, None)
        if confirm_hwnd:
            break
        time.sleep(0.1)
    else:
        alert('Нет окна подтверждения.')
        return
    
    button_hwnd = FindWindowEx(confirm_hwnd, None, 'Button', None)
    if button_hwnd:
        PostMessage(button_hwnd, WM_LBUTTONDOWN, MK_LBUTTON, 0)
        PostMessage(button_hwnd, WM_LBUTTONUP, MK_LBUTTON, 0)
    else:
        alert('Ошибка взаимодействия с окном подтверждения.')

if __name__ == "__main__":
    main()

'''
Описание реализации:
Перемещение файлов:Используем стандартную библиотеку shutil для копирования (copy) и перемещения (move) файла сохранения.
Нажатие горячих клавиш: Для отправки комбинации клавиш используем библиотеку pyautogui. Она также позволяет активировать нужное окно перед отправкой команд клавиатуры.
Работа с окнами: Используется библиотека WinAPI через ctypes и стороннюю библиотеку win32gui для активации окон и проверки их наличия.
Обработка ошибок: Исключения обрабатываются через конструкцию try-except.
Требования к среде исполнения:
Для работы данного сценария потребуется установить необходимые зависимости:

pip install pyautogui pypiwin32

Таким образом, этот скрипт обеспечит аналогичную функциональность, как ваш исходный AutoHotKey-вариант, однако он требует больше зависимостей и проверок окружения, характерных для Python-программ.
'''

9

Re: AHK v2: Превосходство AHK

Malcev пишет:

Потом Lexikos писал много лет autohotkey v2, таки дописал, убрал полностью обратную совместимость с ahk v1, но не добавил ничего нового в плане автоматизации.
Ни одного фреймворка.
То есть, столько лет потратить на создание второй версии, убрать полностью обратную совместимость с библиотеками, написанными за все эти 20 лет, и не добавить ничего нового в плане автоматизации.
Ну такое...

Можно смотреть на v2 как на новое воплощение старой идеи. Если неудачное, то не приживётся, а если удачное, то можно и переписать старые библиотеки. ИИ, кстати, в помощь.
А вот v3 Python тоже несовместима с v2. Что об этом скажете?

10

Re: AHK v2: Превосходство AHK

Ну пайтон создавался, как язык программирования.
А у автохотки была изначально задача сделать так, чтоб любая домохозяйка без знаний функций и объектов могла заниматься автоматизацией.
И если бы Lexikos был бы заинтересован развивать автохотки в подобном ключе, то он бы не ahk v2 (версию для более продвинутых пользователей) писал бы, а добавлял новые фичи для автоматизации уже в существующий код.

11

Re: AHK v2: Превосходство AHK

О превосходстве над cmd. Вроде очевидно, но cmd тоже развивался. Есть полный разворот cmd https://ab57.ru/cmdlist.html, и там есть прямо сложные вещи. Но сложно и неудобно! И в cmd нет ничего, чего нет в AHK. Или я не увидел.

12

Re: AHK v2: Превосходство AHK

Возьмём типовую задачу для cmd, архивацию.

@echo off
rem Обновление архива текущего года документами прошлого и текущего месяцев
rem предполагается ежемесячная архивация
chcp 1251
SETLOCAL ENABLEEXTENSIONS
set year=%DATE:~-4%
IF %year% GEQ 2025 goto ARCH
echo На компьютере неправильная дата
pause
exit /B
:ARCH
set month=%DATE:~3,2%
set /A month=%month%-1
if month EQU 0 (
set month=12
set /A ta=%year%-1
) else set ta=%year%
if %month% LEQ 9 set month=0%month%
Set rar="C:\Program Files\WinRAR\Rar.exe"  u -ed -r -rr -ta%ta%%month% E:\BackUp\Doc
echo 1.Архивация Desktop
%rar%\Desktop%year% D:\Desktop
if %errorlevel%==0 goto ARCH2
pause
if %errorlevel%==10 goto ARCH2
if %errorlevel%==1 goto ARCH2
exit /B
:ARCH2
echo 2.Архивация Documents
%rar%\Documents%year% D:\Documents
if NOT %errorlevel%==0 pause
exit /B

И AHK

year := substr(A_Now, 1, 4)
ta := substr(DateAdd(A_Now, -31, 'days'), 1, 6)
rar := 'C:\Program Files\WinRAR\Rar.exe u -ed -r -rr -ta' . ta . ' E:\BackUp\Doc'
TrayTip 'Архивация Desktop',,'Iconi'
if ExitCode := RunWait(rar . '\Desktop' . year . ' D:\Desktop')
	MsgBox 'Ошибка ' ExitCode
if ExitCode && ExitCode != 1 &&  ExitCode != 10
	ExitApp
TrayTip 'Архивация Documents',,'Iconi'
if ExitCode := RunWait(rar . '\Documents' . year . ' D:\Documents')
	MsgBox 'Ошибка ' ExitCode
ExitApp

Комментарии излишни.

13

Re: AHK v2: Превосходство AHK

А что именно вы тут сравниваете? В обоих случаях архивация не делается силами скрипта, вызывается стороннее приложение.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK v2: Превосходство AHK

Код проще и короче

15 (изменено: 3wedsmncjklvjvd73734, 2025-12-05 22:06:37)

Re: AHK v2: Превосходство AHK

haridev
Возмутило ЭТО-->

haridev пишет:

Код проще и короче

Проще, если знать все тонкости каких либо скобок, двоеточий и плюсиков, двойных, тройных и т.д. языка на котором юзер пишет. Но если говорить о вообще человеческой простоте, то я вижу простоту лишь в одном.
"сижу на диване, смотрю новости и говорю.
- Нейросеть, а ну как давай, залезь в интернет и найди мне все новости про этого самого, банка, который сейчас показывают по телеку!"
И нейросеть напишет на любом языке код прогу которая выполнить это задание и покажет юзеру результат поиска. И юзеру пофигу на каком языке нейросеть будет делать запрос поиска.
Другие же юзеры в этом диалоге с нейросетью, будут видеть своей задачи "улучшать" запрос к нейросети. Типа "убрать лишнее слово  - а ну как давай, залезь в интернет ". Другие же добавят, и "убрать слова - все новости..-" .
Вот ЭТО я понимаю простоту программирования. А не то что юзеру нужно знать язык "С++" что бы написать этот запрос. Или любой другой язык программирования, который требует знания закодированных символов, которые были придуманы неким основателем этого программного языка.
Самый простой, это человеческий язык. И то его надо очень хорошо знать что бы правильно сформулировать запрос, другому человеку, которому этот запрос адресован. Я знаю из "нейронауки", что чел в возрасте уже начинает перегонять своими мыслями, сигналы для голосовых связок. И поэтому очень часто его речь становиться непонятной, из-за "проглатывания" слов.   
Самый простой язык програмирования, это язык который адресован нейросети, для решения определённых задач. И пусть это "предложение" (язык), будет в 10 раз длиннее, того же С++ по количеству символов. Но я точно знаю, что для того что бы добиться результата, самый простой способ это человеческий язык.

16

Re: AHK v2: Превосходство AHK

Думаю, если от нейросети попросить код для архивации на оптимальном языке, то будет AHK
Речь же об этом. К тому же за правильность кода ИИ не отвечает, его надо проверять, а простой и короткий код легче проверить

17

Re: AHK v2: Превосходство AHK

Возращаясь к сложности. В коде для cmd обнаружилась ошибка. После строки 12 нужно  вставить строку

if %month:~0,1%==0 set month=%month:~1,1%

То есть должно быть

:ARCH
set month=%DATE:~3,2%
if %month:~0,1%==0 set month=%month:~1,1%
set /A month=%month%-1 

Ошибка проявляется на месяце <= 9

18 (изменено: haridev, 2025-12-09 16:24:45)

Re: AHK v2: Превосходство AHK

Однако и это неправильно. Надо

@echo off
rem Обновление архива текущего года документами прошлого и текущего месяцев
rem предполагается, что архивация ежемесячная
chcp 1251 > nul
SETLOCAL ENABLEEXTENSIONS
set year=%DATE:~-4%
IF %year% LSS 2025 (
    echo На компьютере неправильная дата
    pause
    exit /B
)
if %DATE:~3,1%==0 (set month=%DATE:~4,1%) else set month=%DATE:~3,2%
if %month%==1 (
    set month=12
    set /A ta=year-1
) else (
    set /A month=month-1
    if %month% LEQ 9 set month=0%month%
    set ta=%year%
)
Set rar="C:\Program Files\WinRAR\Rar.exe"  u -ed -r -rr -ta%ta%%month% E:\BackUp\Doc

echo 1.Архивация Desktop
%rar%\Desktop%year% D:\Desktop
if errorlevel 1 (
    pause
    if NOT %errorlevel%==10 if NOT %errorlevel%==1 exit /B
)

echo 2.Архивация Documents
%rar%\Documents%year% D:\Documents
if errorlevel 1 pause
exit /B

19

Re: AHK v2: Превосходство AHK

AHK v2: Превосходство AHK

Превосходство тёплого над мягким