Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoHotkey

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Открыть новую тему     Написать ответ в эту тему

chum2000

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

   
 
Актуальная версия: AutoHotkey 2.0.5 от 12 августа 2023
Версия для Windows XP | Changes from v1.1 to v2.0
 
Официальный сайт | Англоязычный форум | Архивный форум | Русскоязычный форум
Документация (англ.) | Документация и статьи (рус.) | История изменений
 
Подборка полезных скриптов | AutoHotkey + Total Commander
 

Цитата:
AutoHotkey — бесплатная программа с открытым исходным кодом для создания макросов и автоматизации, позволяющая упростить выполнение повторяющихся задач.
 
AutoHotkey позволяет изменить интерфейс практически любой программы. Имеет собственный скриптовый язык, специально нацеленный на лёгкое назначение и переназначение горячих клавиш.
 
AutoHotkey можно использовать для запуска программ, отправки текста, имитации мыши. Скриптовый язык позволяет управлять окнами, файлами и папками. Команды могут быть активированы горячими клавишами.
 
Также имеются возможности создания GUI, работы с реестром, использования собственного API окон для вызова DLL-файлов. Скрипты можно скомпилировать в EXE-файл и запускать на любом компьютере с Windows соответствующей версии.
 
Наиболее частое применение AutoHotkey:
- переназначение клавиш (глобально или у отдельных программ)
- управление мышью с помощью клавиатуры или джойстика
- слежение за системой, автоматическое выполнение некоторых действий по желанию пользователя, таких как напоминание, сканирование или резервное копирование
 

Всего записей: 505 | Зарегистр. 04-03-2004 | Отправлено: 00:28 02-06-2005 | Исправлено: Egor2020, 10:08 21-09-2023
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Что касается организации. У меня обычно работают несколько неконфликтующих скриптов (в данный момент, например, восемь — наверно, парочку можно и вырубить), и «корневой» находится в автозагрузке. С другой стороны, если есть какая-то конкретная большая задача, её можно разделить на несколько файлов и использовать #Include. Например, так у меня организована система псевдо-раскладок.
 
Список названий специальных клавиш можно посмотреть здесь:
http://www.autohotkey.com/docs/KeyList.htm
Их нажатия всегда можно эмулировать с помощью SendInput, прибавляя при необходимости Down или Up. В качестве префикса Win изображается #, но на семёрке AHK уступает приоритет системе (в XP сочетание #l нормально работает, а в семёрке лочит компьютер). Вообще, любую клавишу можно использовать в качестве префикса с помощью &.
 
Вместо того чтобы нажимать очень много клавиш одновременно, можно подумать об использовании Input. Например, вы нажимаете не Alt+Ctrl+CapsLock+W, а с помощью Alt+Ctrl+CapsLock обращаетесь к Input, который, например, считывает следующий введённый символ и в зависимости от него выполняет то или иное действие. То есть вы нажимаете последователь Alt+Ctrl+CapsLock, w. Вообще, Input — мощная штука.

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 22:23 04-11-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Quasus 19:23 04-11-2012
Цитата:
 большая задача, её можно разделить на несколько файлов и использовать #Include.  

Где можно почитать про эту директиву? Или хотя бы парочку примеров
 

Цитата:
Их нажатия всегда можно эмулировать с помощью SendInput, прибавляя при необходимости Down или Up.

Посмотрел по ссылке, но хотелось бы примеров. Вот как, скажем, эмулировать нажатие клавиши [Win] нажатием клавиши [PrnScr], а и [App] на [Pause] (Вопрос не праздный: у меня выносная клавиша без [Win] и [App]).
И всё же так и не понял, можно ли взаимно поменять Alt <-> Ctrl?
 

Цитата:
Вместо того чтобы нажимать очень много клавиш одновременно, можно подумать об использовании Input. Например, вы нажимаете не Alt+Ctrl+CapsLock+W, а с помощью Alt+Ctrl+CapsLock обращаетесь к Input, который, например, считывает следующий введённый символ и в зависимости от него выполняет то или иное действие.

О! Эта концепция хорошо мне знакома по MS Word, где я наделал себе несколько десятков таких двухступенчатых хоткеев. Но не думал, что так можно сделать на глобальном уровне.
А дальнейшее ветвление тоже возможно? Например, 3-ступенчатый хоткей: Alt+Ctrl+CapsLock -> W -> K или даже Alt+Ctrl+CapsLock -> Ctrl+W -> K?
Опять же, нельзя ли попросить парочку произвольных примеров с [Input].
 
И просто чтобы понимать возможности проги: всё-таки можно при желании сделать хоткеи Alt+Ctrl+CapsLock+W и Alt+Ctrl+2 или нет?
 
Спасибо!
 
Добавлено:
А отловить скан-код клавиши сабж тоже умеет? Допустим, есть мультимедийная клава, на ней всякие кнопки. Их названий в доках AutoHotkey, естественно, нет. Но если бы можно было считать код, выдаваемый при нажатии на определённую клавишу, и задействовать его в хоткее...

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 23:38 04-11-2012
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Про #Include можно почитать, конечно же, в справке. (Вообще, совершенно роскошная справка имхо.) Просто как если другой файл скопипастить на место #Include.
 
С хоткеями вида Alt+Ctrl+CapsLock+W помочь, пожалуй, не могу. Если он их не умеет, это только хорошо, а то их стали бы делать. (chuckle)
 
Вот пример с разными другими штуками.

Код:
 
; remappings
LAlt::LControl
LControl::LAlt
PrintScreen::LWin
 
; Ctrl+Alt+2 may not work if the remappings are in effect
^!2::
MsgBox, Ctrl+Alt+2 pressed
Return
 
; Ctrl + Alt + Caps reads a char
^!CapsLock::
Input, char, L1 ; L1 option indicates we need only one char
If (char = "w")
    MsgBox, W
Else If (char = "q")
    MsgBox, Q
 
; Shift + Caps enables Win + w
+CapsLock::
Hotkey, #w, WinW, On
; enable for max 1 sec
SetTimer, DisableWinW, -1000
return
 
WinW:
MsgBox, Ctrl+w finally pressed
Hotkey, #w, Off
Return
 
DisableWinW:
Hotkey, #w, Off
Return
 

 
Для извлечения сканкодов я пользуюсь следующим нехитрым скриптом:
^+sc01::SendInput, sc01
^+sc02::SendInput, sc02
...
^+scA6::SendInput, scA6
(чуть побольше, чем полторы сотни строчек).
 
EDIT
Пропорциональный шрифт в теге code... (facepalm)

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 12:56 05-11-2012 | Исправлено: Quasus, 12:59 05-11-2012
OnMyDSeeAtAll



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oshizelly 20:45 04-11-2012 Подробнее...
Цитата:
...заголовок окна Total Commander начинается с названия программы.
Поняна, это я просто забыл, что Total Commander у меня из под администратора запущен, и у него перед заголовком логин-юзверь прописан.
Цитата:
А нельзя ли попросить хотя бы один пример с использованием шаблона ExcludeTitle?

Код:
; у меня UI в Win7 стоит английская, так, что в русском юзер интерфэйсе ОС
; названия у окон блокнота по умолчанию выглядят иначе, думаю не трудно будет
; Untitled на Безымянный изменить и т.д.)
; разкомментируйте строку SetTitleMatchMode в группе, и один из вариантов
 
; SetTitleMatchMode, RegEx
; #If, WinActive("Notepad", Notepad, "ExcludeTitle")
; #If, WinActive("Notepad", Untitled, "ExcludeTitle")
; #If, WinActive("Untitled", Untitled, "ExcludeTitle")
; #If, WinActive("ahk_class Notepad", Untitled, "ExcludeTitle")
; #If, WinActive("ahk_class Notepad", Notepad, "ExcludeTitle")
 
; SetTitleMatchMode, 1
; #If, WinActive("Untitled", Untitled, "ExcludeTitle")
; #If, WinActive("ahk_class Notepad", Untitled, "ExcludeTitle")
 
; SetTitleMatchMode, 2
; #If, WinActive("Untitled", Notepad, "ExcludeTitle")
; #If, WinActive("Notepad", Notepad, "ExcludeTitle")
; #If, WinActive("Notepad", Untitled, "ExcludeTitle")
; #If, WinActive("ahk_class Notepad", Untitled, "ExcludeTitle")
 
; SetTitleMatchMode, 3
; #If, WinActive("Untitled - Notepad", Untitled - Notepad, "ExcludeTitle - Notepad")
; #If, WinActive("Untitled - Notepad", Untitled, "ExcludeTitle - Notepad")
; #If, WinActive("Untitled - Notepad", Untitled - Notepad, "ExcludeTitle")
; #If, WinActive("ahk_class Notepad", Untitled - Notepad, "ExcludeTitle - Notepad")
 
; даст совпадеие по началу строки без использования SetTitleMatchMode, т.к. по умолчанию стоит 1
; #If, WinActive("ahk_class Notepad", Note, "Exclude")
#If
, WinActive("Unt", Untit, "Exc")
   +
F6::SoundBeep
 
#If
;#IfWinActive ;или
   
+F6::MsgBox, 262160
                       
,
% A_Space
                       
, % "You pressed Shift+F6 NOT in Untitled - Notepad"
                       
,
% 0.5

Цитата:
...я уже убедился экспериментально, что можно сделать, например, Alt+Ctrl+CapsLok. А вот Alt+Ctrl+CapsLok+W не работает.

Код:
!^CapsLock:: ; alt+ctrl+capslock
   
KeyWait, vk57, D T.25 ; ждём нажатия W/Ц 250 миллисекунд
   
If ErrorLevel ; ErrorLevel=1, если время вышло, а W/Ц не была нажата
     
MsgBox, 262160 ; делаем первое действие
                 
, % "Alt+Ctrl+CapsLock+W"
                 
,
% "key combination DON'T pressed"
                 
,
% 0.5
   
Else ; или второе
     
MsgBox, 262208
                 
,
% "Alt+Ctrl+CapsLock+W"
                 
,
% "key combination pressed"
                 
,
% 0.5
   
Return
или так:
Код:
!^CapsLock::
   
KeyWait,
vk57, D T.25
   
CheckUp(ErrorLevel)
   
Return
 
CheckUp(Param)
{
; "!" - логическое нет
   ; соответственно, если параметр фунции (Param)
   ; по переданному аргументу (ErrorLevel) содержит ноль
   ; делаем первое действие, или делаем второе
   
MsgBox, % 262 . (!Param ? 208:160) ; логическое выражение ? выражение1:выражение2
               
, % "Alt+Ctrl+CapsLock+W"
               
,
% "key combination "(!Param ? "":"DON'T ")"pressed"
               
,
% 0.5
}
oshizelly 22:38 04-11-2012 Подробнее...
Цитата:
Где можно почитать про эту директиву? Или хотя бы парочку примеров
Создаём в корневой папке программы папку с названием Lib, сохраняем там файл с названием test.ahk c таким содержанием:
Код:
test_func(ByRef mText)
{
   
mText:="caller:`n"A_ScriptFullPath
   
mCaption:="Hello world!"
   
Return,
mCaption
}
В данном случае очень важно, чтобы название файла и префикс были одинаковые, а между префиксом и названием функции был символ нижнего подчёркивания ( _ ). Создаём и сохраняем второй файл с названием test2.ahk уже в той же директории, где и сам запускающий файл с таким кодом:
Код:
func(Param1, Param2, ByRef Param3)
{
   
Param3:=Param1+Param2
}
Вызываем функции из созданных в разных местах файлов запускным:
Код:
; т.к. это спецефическая папка .\AutoHotkey\Lib
; #Include, test.ahk писать не нужно, он будет найден по префиксу
#Include
, test2.ahk ; а вот тут нужно явным образом указать
 
; вызываем из .\AutoHotkey\Lib\test.ahk функцию
MsgBox, 262144, % test_func(msgText), % msgText
 
; вызываем функцию из test2.ahk (та же папка где и сам запускной)
func(2, 2, sum)
MsgBox, 262144,
% "2+2", % "result: "sum
 
ExitApp

Добавлено:
@oshizelly
Судя по количеству сообщений, Вы тут человек бывалый, объясните мне плиз, как убрать Подробнее...? Я видимо, чего-то не так сделал, когда первый раз игрался с тэгом [more]...

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 04:59 06-11-2012 | Исправлено: OnMyDSeeAtAll, 10:37 08-12-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OnMyDSeeAtAll 02:59 06-11-2012  
 
Огромное спасибо за подробные примеры с комментариями, буду изучать.
 


Цитата:
объясните мне плиз, как убрать Подробнее...?  

Ответил в ПМ (персональный ящик), дабы не засорять тему непрофильным общением.
 
И вот здесь подробно ответил

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 05:35 06-11-2012 | Исправлено: oshizelly, 05:41 06-11-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Quasus 10:56 05-11-2012
Цитата:
Для извлечения сканкодов я пользуюсь следующим нехитрым скриптом:  
 ^+sc01::SendInput, sc01  
 ^+sc02::SendInput, sc02  
 ...  
 ^+scA6::SendInput, scA6  
 (чуть побольше, чем полторы сотни строчек).

А нельзя ли весь скрипт целиком выложить (под тэгом more)? А то я начну набивать вручную, ошибок наделаю, тем более шестнадцатиричное исчисление...
  

Цитата:
Пропорциональный шрифт в теге code... (facepalm)

Это к чему относится

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 22:51 06-11-2012
creature_ws



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1.1.09.00 - November 7, 2012
changelog

Всего записей: 304 | Зарегистр. 29-07-2008 | Отправлено: 09:16 07-11-2012
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А нельзя ли весь скрипт целиком выложить (под тэгом more)? А то я начну набивать вручную, ошибок наделаю, тем более шестнадцатиричное исчисление...  

 
Прошу:
 
Подробнее...
 
 
Добавлено:

Цитата:
Это к чему относится  

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

Цитата:
1.1.09.00 - November 7, 2012
changelog

 
 
А я и не знал, что теперь в ANSI. Ну, BOM так BOM. Спасибо!

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 13:22 07-11-2012 | Исправлено: Quasus, 13:23 07-11-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Очередной вопрос чайника. Как сделать, чтобы хоткей активировал окно приложения, допустим, того же Total Commander, если это приложение уже запущено, а если не запущено, то запускал бы его? Как сделать каждую команду по отдельности, вроде бы понятно, но хочется, чтобы выбор нужного варианта производился автоматически.  
Внятного ответа в доступных источниках не нашёл.
Спасибо!

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 00:10 14-11-2012
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Квик’н’дёрти:
 

Код:
 
ActivateOrRun(WinTitle, Path)
{
    If (WinExist(WinTitle))
        WinActivate
    Else
        Run, %Path%
}
 
SetTitleMatchMode, 2
TCTitle = Total Commander
TCPath = %ProgramFiles%\Total Commander\blah-blah
ActivateOrRun(TCTitle, TCPath)
 

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 00:49 14-11-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Quasus 22:49 13-11-2012
Цитата:
Квик’н’дёрти:

Похоже, немного слишком квик. Или я что-то неправильно сделал? Вот мой реальный код:

Код:
+^!T::        ; start or maximize or bring to front Total Commander (work)
ActivateOrRun(WinTitle, Path)  
{  
    If (WinExist(WinTitle))  
        WinActivate  
    Else  
        Run, %Path%  
}  
SetTitleMatchMode, 1  
TCTitle = Total Commander  
TCPath = C:\Program Files\TotalCmd 8.0\TOTALCMD.EXE
ActivateOrRun(TCTitle, TCPath)  
 

 
А вот чего он мне пишет при попытке запустить файл с этим скриптом:
 
 

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 01:13 14-11-2012
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это просто потому что описание функции попало в горячую клавишу. Если его в начало скрипта переместить, работает. (Я функцию запилил, чтобы было не совсем уж дёрти.)

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 01:24 14-11-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Quasus 23:24 13-11-2012
Цитата:
Это просто потому что описание функции попало в горячую клавишу.  

Имеется в виду добавленный мной комментарий "start or maximize or bring to front Total Commander (work)"? Нет, похоже, дело не в этом. Я вообще его удалил, но сообщение об ошибке выдаётся точно такое же.
 
Вот исправленный код:

Код:
+^!T::
ActivateOrRun(WinTitle, Path)  
{  
    If (WinExist(WinTitle))  
        WinActivate  
    Else  
        Run, %Path%  
}  
 
SetTitleMatchMode, 2
TCTitle = Total Commander  
TCPath = C:\Program Files\TotalCmd 8.0\TOTALCMD.EXE
ActivateOrRun(TCTitle, TCPath)  

 
Какие такие лейблы его смущают
 
P.S.
Сколько раз видел, как комментарий был вот именно так написан, как я его вписал: в 1-й строке скрипта, сразу после хоткея, но отделённый точкой с запятой. Да вот хоть на этой странице топика чуть выше.

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 01:42 14-11-2012 | Исправлено: oshizelly, 01:43 14-11-2012
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
С комментарием всё нормально. Дело в функции. Она начинается со слова ActivateOrRun и заканчивается скобкой }. Определять функцию внутри горячей клавиши как-то неестественно. Справка рекомендует функции определять в начале скрипта.
 
В вашем случае достаточно переставить строку +^!T:: после }, и заработает. Хотя для порядка неплохо бы в конце написать Return, завершающий многострочный хоткей.

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 01:47 14-11-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Quasus 23:47 13-11-2012
Цитата:
С комментарием всё нормально. Дело в функции. Она начинается со слова ActivateOrRun и заканчивается скобкой }. Определять функцию внутри горячей клавиши как-то неестественно. Справка рекомендует функции определять в начале скрипта.

Тёмные мы, нормальных слов не понимаем  
Теперь заработало
 
Правда, всё равно есть небольшая неувязка. У меня в системе имеется 2 разных Total Commander, у каждого совершенно разные настройки и сферы применения, причём запущены обычно оба. Я рассчитывал, что данный скрипт будет выводить, на передний план или запускать именно того TC, который живёт по явно указанному адресу TCPath = C:\Program Files\TotalCmd 8.0\TOTALCMD.EXE. Но вместо этого выводится на передний план окно того TC, которое позже было активно. Даже если "наш" TC вообще не запущен, то скрипт не запускает его, а выводит на передний план окно второго TC. Это уже никак не лечится?

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 02:03 14-11-2012
OnMyDSeeAtAll



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
@oshizelly Вы опишите в чём они имеют разницу?, просто не понятно по какому критерию их отличать, чтобы пользаваться горячей клавишей в отношении нужного. Варианты: время запуска, версия, полный путь, если в одной папке и одной версии, то дата создания, размер файла, отличие можно найти. А самое главное, информацию в точности донести сюда!), это ускорит достижение конечного результата.

Всего записей: 100 | Зарегистр. 08-07-2011 | Отправлено: 06:50 14-11-2012 | Исправлено: OnMyDSeeAtAll, 07:16 14-11-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OnMyDSeeAtAll 04:50 14-11-2012  
Цитата:
Вы опишите в чём они имеют разницу?, просто не понятно по какому критерию их отличать, чтобы пользаваться горячей клавишей в отношении нужного. Варианты: время запуска, версия, полный путь, если в одной папке и одной версии, то дата создания, размер файла,

Они в разных папках живут. Тот, который нам нужен, в папке C:\Program Files\TotalCmd 8.0 (соответственно, полное имеет имя исполнимого файла C:\Program Files\TotalCmd 8.0\TOTALCMD.EXE). А второй - в папке C:\Program Files\TotalCmd_02.
Да, версии тоже разные, но это временно, всё никак не соберусь второй обновить.
Время запуска случайное.

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 12:00 14-11-2012 | Исправлено: oshizelly, 13:04 14-11-2012
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oshizelly, описываемые вами эффекты ожидаемы. Предложенный мной скрипт использует для идентификации окна ни больше ни меньше чем заголовок окна.
 
Мне кажется, проще всего было бы отдать запуск TC на откуп скрипту. Тогда скрипт знал бы, какое окно чьё, и какого окна не хватает если не хватает. Это несложно сделать через pid, попозже напишу. При этом запуск TC через скрипт не является ограничительным для пользователя, потому что, например, его ярлыки можно перенаправить на скриптики, которые бы отправляли главному скрипту сообщение, что нужно запускать (с помощью PostMessage).

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 13:58 14-11-2012
oshizelly



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Quasus 11:58 14-11-2012
Цитата:
Мне кажется, проще всего было бы отдать запуск TC на откуп скрипту... Это несложно сделать через pid, попозже напишу.  

Это смотря кому несложно Конечно, так было бы логично.

Всего записей: 6524 | Зарегистр. 18-09-2004 | Отправлено: 14:22 14-11-2012
Quasus

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
 
Show(App) {  
    wt := "ahk_pid " . App.PID
    If (WinExist(wt))
        WinActivate  
    Else {
        path := App.Path
        Run, %path%,,, pid
        App.PID := pid
    }
}
 
NewApp(Path) {
    return {"Path" : Path, "PID" : ""}
}
     
SetTitleMatchMode, 2  
TCPath1 = ...
TCPath2 = ...
TC1 := NewApp(TCPath)
TC2 := NewApp(TCPath)
Return
 
F1::Show(TC1)  
F2::Show(TC2)
 

 
Вот это вроде работает. «Мясо» здесь — функция Show, которая проверяет наличие окна с заданным PID и активирует его, если оно существует; если не существует, запускает программу и сохраняет PID процесса. Главное здесь то, что WinActivate может брать не только заголовок, но и ahk_class и ahk_pid, а при желании всю такую информацию можно достать (например, с помощью WinGet, а здесь хватает и просто Run).
 
Остальное — украшательство. Объекты в AHK_L мне что-то лень глубоко разбирать, а с замыканиями и функциями высшего порядка он, к счастью, не дружит. Здесь я просто использовал хеш-таблицы (словари по-питоновски), чтобы сохранять путь и PID.

Всего записей: 43 | Зарегистр. 08-05-2012 | Отправлено: 00:53 15-11-2012
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76

Компьютерный форум Ru.Board » Компьютеры » Программы » AutoHotkey


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru