1

Тема: AHK: интеллигентное закрытие скрипта при выходе из программы.

Приветствую!

Я работаю в Cinema 4D и хочу, чтобы при закрытии программы по хоткею Ctrl+q AHK-скрипт закрывался автоматически. Очевидное решение:

^q::
Send !{F4}
ExitApp

Но при случайном нажатии или если я передумал выходить из программы, скрипт уже закрыт.
Варианты решения с Loop или Timer плохи тем, что существует некоторый временной интервал, в течении которого необходимо принять решение.

При попытке закрыть программу, практически всегда выскакивает Dialog Box сохранения внесенных изменений (Да, Нет, Отмена), который имеет отличный от основной программы Title. Уже что-то. Соответственно, вопрос вот в чём - можно ли отследить нажатие на клавишу "Отмена" - тогда скрипт продолжает работу, и, соответственно, закрывает сприпт во всех остальных случаях.

Title основного окна программы - CINEMA 4D R16.011 Studio (R16)
Title диалогового окна - Cinema 4D Studio

2

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

AutoHotkey позволяет просто следить за существованием окна.

"Window Management" - "WinWaitClose", перевод YMP пишет:
WinWaitClose

Ждёт закрытия указанного окна.

WinWaitClose [, WinTitle, WinText, Seconds, ExcludeTitle, ExcludeText]

3

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Да, но это как раз вариант с временным интервалом, в течении которого надо принять решение - закрываю программу или нет. Работоспособно, но интересно, возможно ли без него?

4 (изменено: Irbis, 2015-03-14 13:25:50)

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Кто вас заставляет определять интервал? Можно ждать (бесконечно) закрытия диалогового окна, затем проверить, существует ли еще основное окно.

^q::
   Send !{F4}
   sleep 1000
   WinWaitClose, Cinema 4D Studio
   sleep 1000
   IfWinNotExist, CINEMA 4D R16.011 Studio (R16)
   {
      MsgBox % "Мне, право, неловко, но с прискорбием сообщаю, что моя миссия окончена, за сим откланиваюсь. Честь имею, сударь."
      ExitApp
   }
Return

Upd: Совсем упустил из виду, тут же ключевое слово "интеллигентное". Внес необходимые исправления.

5

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Варианты решения с Loop или Timer плохи тем, что существует некоторый временной интервал, в течении которого необходимо принять решение.

Не совсем понятно, что это значит. Какие варианты вы имеете в виду и что за интервал им мешает?

6

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

YMP пишет:

Не совсем понятно, что это значит. Какие варианты вы имеете в виду и что за интервал им мешает?

Вариант скрипта с проверкой существования окна в течении некоторого времени:

^q::    
Send !{F4}
loop 100
{
sleep 100
IfWinExist, CINEMA 4D R16.011 Studio (R16)
continue
ExitApp
break
}
Return

В таком случае скрипт следит за существованием окна Cinema в течении 10-и секунд и если я выхожу из программы, то закрывает скрипт, если же не выхожу, просто прерывает исполнение хоткея. И все варианты с WinWaitClose и прочие - они зависят от заданного временного интервала или запускают бесконечный цикл проверки существования окна. А вот тут я точно не знаю. На мой взгляд, наличие бесконечного цикла проверки не есть очень хороший вариант решения.

Можно ли как-то это решить через Control? Логика такая - нажатие на одну из кнопок диалогового окна сохранения файла при выходе из программы - событие, отправляющее в скрипт значение, и в зависимости от него уже происходят дальнейшие действия.

7 (изменено: Kamagi, 2015-03-14 17:53:54)

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Irbis,
право же, боюсь показаться вам бестактным и назойливым, но есть ли решение с бесконечным циклом достаточно интеллигентное, достойное двух благородных донов? Не будут ли ресурсы компьтера возмущены сиим напором?

8

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Компьютер даже не заметит этого напора.

Можно ли как-то это решить через Control? Логика такая - нажатие на одну из кнопок диалогового окна сохранения файла при выходе из программы - событие, отправляющее в скрипт значение, и в зависимости от него уже происходят дальнейшие действия.

Ни диалог, ни кнопка не принадлежат скрипту, поэтому и отправлять в него ничего не будут. Думаю, можно повесить хоткей на левую кнопку, привязанный к диалоговому окну, который будет определять место щелчка. Если MouseGetPos способна определить ClassNN этих кнопок, то можно по нему ориентироваться. Если нет, тогда по координатам.

Но что это будет означать фактически? Видимо, что при любом левом щелчке, где бы то ни было, скрипт будет проверять, какое окно активно. Не покажется ли благородному интеллигентному дону это растратой ресурсов?

9 (изменено: Kamagi, 2015-03-14 14:41:20)

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Хорошо, тогда если не выйдет, решу через WinWaitClose. Но с вариантом без бесконечного цикла/временного интервала мне пока ещё интересно помучиться. Сейчас пытаюсь выяснить - возможно ли отследить клик мышкой? Выхода из диалогового окна, по сути, два - нажимаю Esc или кликаю на кнопке "Отмена" и скрипт продолжает работать (во всех остальных случаях закрывается и программа, и скрипт). Проверку можно сделать даже через loop - ничего страшного, цикл сразу прервётся по событию, которое произойдёт в любом случае. Нажатие "Esc" можно отследить по KeyWait, а вот как отследить клик мышкой? Что-то вроде:

if A_ThisHotkey = MButton

Но эта конструкция, конечно, не работает.
MouseGetPose, кстати, может отпределить ClassNN кнопки, так что сработает. Если я найду, как отследить клик мышкой без того, чтобы вешать хоткей на левую кнопку (подобный вариант ещё дальше от интеллигентного решения, чем бесконечный цикл ), то скрипт срастётся. Копаю GetKeyState.

10

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Хоткей на левую кнопку и есть отслеживание клика мышкой. Ну, допустим, реализуете вы то же самое через, интеллигентно выражаясь, анальный проход и что вам это даст, кроме спортивной гордости?

Кстати, хоткей ведь можно временно назначать командой Hotkey, потом убирать.

11

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Kamagi пишет:
if A_ThisHotkey = MButton

Но эта конструкция, конечно, не работает.

У меня работает.

12

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Полагаю, решил, как и хотел, ха-ха!

^q::
Send ! {F4}                                                                    ;### Посылаем закрытие проги, ею выводится диалоговое окно
loop                                                                                ;### Бесконечный цикл
{
GetKeyState, LMB, LButton                                             ;### Проверяем нажатие кнопки мыши
if LMB = D                                                                        ;### Если нажата
    {
    MouseGetPos, , , , Button                                            ;### Ищем название кнопки под курсором
    if (Button = "Button1" or Button = "Button2")             ;### Если это "Да" или "Нет"
        ExitApp                                                                    ;### Закрывает скрипт
    else                                                                             ;### Во всех остальных случаях возврат
        Return
    }
else GetKeyState, Esc, Esc                                              ;### Проверяем, нажат ли Esc
    {
    if Esc = D                                                                     ;### Если да, то возврат
        Return
    else                                                                             ;### Если нет, возврат в начало цикла
        Continue
    }
}

13 (изменено: Kamagi, 2015-03-14 15:41:54)

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

YMP,
В моём варианте цикл работает только на время существования диалогового окна сохранения файла, что не очень страшно. WinWaitClose не запущен на протяжении всей работы, что на мой взгляд тоже хорошо. Учтены, кажется, все возможные варианты развития событий, и скрипт выгружается только в случае, если программа действительно закрылась. В любом случае, спасибо за ответы.

ypppu,
Хммм...

14

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Хоткей тоже может работать на время существования диалога. Для этого есть команда Hotkey.

15

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Да, но это как раз вариант с временным интервалом, в течении которого надо принять решение - закрываю программу или нет. Работоспособно, но интересно, возможно ли без него?

http://forum.script-coding.com/viewtopic.php?id=8326

16

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Нет, не понять мне желания некоторых пользователей изобрести свой велосипед с квадратными колесами, и ездить на нем по ухабам без седушки.

Kamagi, если бы ваша наблюдательность хоть бы на малость приблизилась по величине к вашей тяге к эпистолярному жанру, вы бы заметили, что в приведенном в #4 коде "бесконечное" ожидание происходит лишь в момент нажатия хоткея, и длится не более, чем существует диалоговое окно. Никакого цикла не крутится, следовательно - напряженности и взаимонедопонимания между скриптом и другими потребителями ресурсов не возникает.

17 (изменено: Kamagi, 2015-03-14 20:48:07)

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Malcev,
сие для меня пока что трудновато, но поковырять желание появилось. Спасибо за ссылку.

Irbis,
разве изобретать свой велосипед не интересней, чем брать уже готовый? Скрипт #4 характерен тем, что если пользователь на время существования диалогового окна в течении 2-ух секунд не принял решения (затупил, отвлёкся, мало ли), то при закрытии программы скрипт не закрывается. Мой последний вариант исключает подобную возможность.

18

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Kamagi пишет:

...Учтены, кажется, все возможные варианты развития событий...

Да у вас даже принадлежность кнопки к окну не проверяется, равно как и заголовок активного окна при нажатии Esc. А ведь пользователь может и в другое окно ткнуть курсором. Образно говоря, велосипед, кроме авторской патентованной конструкции, комплектуется набором граблей для удобного на них наезжания, при полном отсутствии активной обороны от них в виде программных костылей. ))

19

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Kamagi пишет:

...Скрипт #4 характерен тем, что если пользователь на время существования диалогового окна в течении 2-ух секунд не принял решения (затупил, отвлёкся, мало ли), то при закрытии программы скрипт не закрывается.

Значит, неправильно указаны заголовки окон в #1. У меня в notepad++ нажатие на F10 работает, как задумано.

F10::
   Send !{F4}
   sleep 1000 
   WinWaitClose, Save ahk_exe notepad++.exe 
   sleep 1000
   IfWinNotExist, ahk_exe notepad++.exe
      ExitApp
Return 

20

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Irbis, разобрался. Признаю, я затупил, ваш скрипт работает, но тем не менее его необходимо доработать. В случае, если при закрытии программы мне необходимо сохранить редактируемый файл, и эта операция занимает более секунды, скрипт не выгружается. Вопрос решается проверкой существования диалогового окна сохранения файла:

^q::
   Send !{F4}
   sleep 1000 
   WinWaitClose, CINEMA 4D Studio
   sleep 1000
   ifWinExist, Save File
        ExitApp
   IfWinNotExist, CINEMA 4D R16.011 Studio (R16)
        ExitApp
Return 

21

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Можно и так сделать. У каждой программы своя специфика (np++ сохраняет практически мгновенно), к тому же практически любая задача имеет более чем 1 решение.

22

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

YMP пишет:

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

А как же SetWinEventHook? Есть EVENT_SYSTEM_CAPTUREEND, есть также EVENT_SYSTEM_DIALOGSTART и EVENT_SYSTEM_FOREGROUND для того чтобы не проверять более частые CAPTUREEND. Также данный хук запускает поток даже при отображении скриптом своего меню.

Kamagi пишет:

чтобы при закрытии программы ... AHK-скрипт закрывался автоматически.

А зачем тут привязка к окнам, если нужно всего лишь следить за наличием процесса данной программы?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23 (изменено: Alectric, 2015-03-14 22:52:00)

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

Почему бы не использовать "process,exist"?

OFF: Вечно я отписываюсь не обновляя страницу...

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

24

Re: AHK: интеллигентное закрытие скрипта при выходе из программы.

serzh82saratov пишет:

А как же SetWinEventHook?

Не в курсе.