Ru-Board.club
← Вернуться в раздел «Программы»

» AutoHotkey

Автор: creature_ws
Дата сообщения: 29.10.2012 08:53
Пробел добавить можно разными способами.
Send - команда. В качестве аргумента эта команда ожидает имена клавиш и|или строку символов. Ниже - варианты «добавления пробела», рекомендую уловить суть


Код: SendInput %A_MDAY%-%A_MM%-%A_Year%%A_Space% ; добавляем в конец строки содержимое встроенной переменной содержащей пробел

SendInput %A_MDAY%-%A_MM%-%A_Year%{Space} ; добавляем имя клавиши «пробел»

SendInput %A_MDAY%-%A_MM%-%A_Year% ` ; добавляем экранирующий символ после пробела для предотвращения автоматического отсекания завершающих пробелов в строках подразумевающих «не выражение»

SendInput % A_MDAY "-" A_MM "-" A_Year " " ; «переключаем» с помощью знака процента поле аргумента в выражение, добавляем пробел к выражению в виде подстроки содержащий лишь пробел.

SendInput % A_MDAY "-" A_MM "-" A_Year A_Space ; аналогично предыдущему, но пробел представлен в виде переменной его содержащей.
Автор: oshizelly
Дата сообщения: 29.10.2012 14:31
creature_ws 07:53 29-10-2012

Цитата:
Если нажатием ctrl shift capslock нужно «нажимать» alt shift:

Код: ^+CapsLock::
SetKeyDelay, 10, 10
Send {Alt Down}{shift}{Alt Up}
return
Автор: creature_ws
Дата сообщения: 29.10.2012 18:36

Цитата:
Возможно, неверно передано нажатие комбинации Alt+Shift

Комбинация передана верно, изобретать нечего.
Автор: oshizelly
Дата сообщения: 29.10.2012 19:18
creature_ws 17:36 29-10-2012
Цитата:
Комбинация передана верно

Но не работает корректно... По крайней мере у меня. Или двойное нажатие в данном случае неизбежное условие? Хотя, повторю, нативное сочетание Alt+Shif работает с одинарным нажатием.
Автор: oshizelly
Дата сообщения: 29.10.2012 23:24
Перерыл весь интернет и мозг себе сломал. Не понимаю. как можно установить окно (или все окна определённого процесса) в качестве исключения. Нашёл команду ExcludeTitle, но она не работает (или неправильно её использую).
Решил пойти от противного, то есть, задать в левой и правой части строки одинаковые комбинации для исключаемого приложения:

Код: #IfWinActive, Total Commander
+F6::SendInput +{F6}

#IfWinActive
+F6::MsgBox You pressed Shift+F6 NOT in TC
Автор: creature_ws
Дата сообщения: 30.10.2012 00:21

Цитата:
Что делать, чтобы скрипт работал во всех окнах, за исключением указанного

Не скрипт, а горячие клавиши, вероятно.

Код: #IfWinNotActive
Автор: OnMyDSeeAtAll
Дата сообщения: 30.10.2012 04:32
oshizelly
Цитата:
Но в результате хоткей перестает вообще выполнять какие бы то ни было действия...
Вы же ищете по части названия окна, директива SetTitleMatchMode в помощь:
Код: SetTitleMatchMode, 2
;SetTitleMatchMode, RegEx ;или

#IfWinActive
, Total Commander
+F6::SendInput, +{F6}

#IfWinActive
;#If ;или
+F6::MsgBox, 262144, % " ", % "You pressed Shift+F6 NOT in TC", % 0.5
Автор: oshizelly
Дата сообщения: 04.11.2012 19:37
OnMyDSeeAtAll
creature_ws
Прошу прощения, что сразу не ответил: потребовалось много времени, чтобы въехать во все детали (да и в прочая жизнь требует некоторого внимания).

OnMyDSeeAtAll 03:32 30-10-2012
Цитата:
Вы же ищете по части названия окна, директива SetTitleMatchMode в помощь:

По Вашей ссылке сказано, что если значение SetTitleMatchMode явным образом не задано, то подразумеваются значения "1" ("Заголовок окна должен начинаться со значения, заданного в WinTitle). Это как раз мой частный случай: заголовок окна Total Commander начинается с названия программы. Так что причина нестыковки не в этом.

Возможно, мой скрипт всё же не работает по той простой причине, что AutoHotkey, в принципе, не позволяет назначить хоткей ему же самому, чтобы значение левой и правой частей директивы были тождественны? По крайней мере, мне такого сделать не удалось.

Цитата:
Группировать, и проверять можно по классу...
или проверять в условии по названию процесса...
по шаблону...
тоже самое, только через функцию...

Сколько, оказывается, есть способов, чтобы решить одну и ту же задачу
А нельзя ли попросить хотя бы один пример с использованием шаблона ExcludeTitle?


creature_ws 23:21 29-10-2012
Цитата:

Цитата: Что делать, чтобы горячие клавиши работали во всех окнах, за исключением указанного


Код: #IfWinNotActive
Автор: Quasus
Дата сообщения: 04.11.2012 20:23
Что касается организации. У меня обычно работают несколько неконфликтующих скриптов (в данный момент, например, восемь — наверно, парочку можно и вырубить), и «корневой» находится в автозагрузке. С другой стороны, если есть какая-то конкретная большая задача, её можно разделить на несколько файлов и использовать #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 — мощная штука.
Автор: oshizelly
Дата сообщения: 04.11.2012 21:38
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, естественно, нет. Но если бы можно было считать код, выдаваемый при нажатии на определённую клавишу, и задействовать его в хоткее...
Автор: Quasus
Дата сообщения: 05.11.2012 10:56
Про #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
Автор: OnMyDSeeAtAll
Дата сообщения: 06.11.2012 02:59
oshizelly 20:45 04-11-2012 [more]http://forum.ru-board.com/topic.cgi?forum=5&topic=16053&start=320#21[/more]
Цитата:
...заголовок окна 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
Автор: oshizelly
Дата сообщения: 06.11.2012 03:35
OnMyDSeeAtAll 02:59 06-11-2012

Огромное спасибо за подробные примеры с комментариями, буду изучать.



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

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

[more=И вот здесь подробно ответил]OnMyDSeeAtAll 02:59 06-11-2012
Цитата:
объясните мне плиз, как убрать Подробнее...? Я видимо, чего-то не так сделал,

У Вас сделано всё правильно, только наоборот
Надо так:
1. Выделяем текст, который хотим скрыть от милиции глаз.
2. Жмём кнопку с "волнами" над постом
3. В окошко запроса вводим отсылочный текст и жмём кнопку [Дальше]. В результате выделенный текст обрамляется тэгами <more></more>, а внутри первого из них дан отсылочный текст.

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

А когда вводится гиперлинк, то наоборот: текст надо выделить в посте, потом нажать кнопку и ввести адрес ссылки в окошко запроса. Поначалу все путаются

Вот пример у меня в этом посте. Чтобы увидеть, как это сделано, надо нажать ссылку "Редактировать" справа от имени автора поста. Так Вы увидите, как оно там внутри устроено. Я тоже иногда так делаю, когда вижу интересно оформленный чужой пост. Разумеется, Вы не сможете отредактировать чужой пост. Точнее, отредактировать нет проблем, вот только сохранить изменения не удастся.

Кстати, многие не знают, что можно просмотреть часть поста, скрытую под "море", не открывая его в отдельной вкладке. Для этого надо навести указатель мыши на вопросительный знак после отсылочного текста.[/more]
Автор: oshizelly
Дата сообщения: 06.11.2012 20:51
Quasus 10:56 05-11-2012
Цитата:
Для извлечения сканкодов я пользуюсь следующим нехитрым скриптом:
^+sc01::SendInput, sc01
^+sc02::SendInput, sc02
...
^+scA6::SendInput, scA6
(чуть побольше, чем полторы сотни строчек).

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

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

Это к чему относится
Автор: creature_ws
Дата сообщения: 07.11.2012 07:16
1.1.09.00 - November 7, 2012
changelog
Автор: Quasus
Дата сообщения: 07.11.2012 11:22

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


Прошу:

[more]
SetTitleMatchMode, 2
#IfWinActive, < insert you editor here >
^+sc01::SendInput, sc01
^+sc02::SendInput, sc02
^+sc03::SendInput, sc03
^+sc04::SendInput, sc04
^+sc05::SendInput, sc05
^+sc06::SendInput, sc06
^+sc07::SendInput, sc07
^+sc08::SendInput, sc08
^+sc09::SendInput, sc09
^+sc0A::SendInput, sc0A
^+sc0B::SendInput, sc0B
^+sc0C::SendInput, sc0C
^+sc0D::SendInput, sc0D
^+sc0E::SendInput, sc0E
^+sc0F::SendInput, sc0F
^+sc10::SendInput, sc10
^+sc11::SendInput, sc11
^+sc12::SendInput, sc12
^+sc13::SendInput, sc13
^+sc14::SendInput, sc14
^+sc15::SendInput, sc15
^+sc16::SendInput, sc16
^+sc17::SendInput, sc17
^+sc18::SendInput, sc18
^+sc19::SendInput, sc19
^+sc1A::SendInput, sc1A
^+sc1B::SendInput, sc1B
^+sc1C::SendInput, sc1C
^+sc1D::SendInput, sc1D
^+sc1E::SendInput, sc1E
^+sc1F::SendInput, sc1F
^+sc20::SendInput, sc20
^+sc21::SendInput, sc21
^+sc22::SendInput, sc22
^+sc23::SendInput, sc23
^+sc24::SendInput, sc24
^+sc25::SendInput, sc25
^+sc26::SendInput, sc26
^+sc27::SendInput, sc27
^+sc28::SendInput, sc28
^+sc29::SendInput, sc29
^+sc2A::SendInput, sc2A
^+sc2B::SendInput, sc2B
^+sc2C::SendInput, sc2C
^+sc2D::SendInput, sc2D
^+sc2E::SendInput, sc2E
^+sc2F::SendInput, sc2F
^+sc30::SendInput, sc30
^+sc31::SendInput, sc31
^+sc32::SendInput, sc32
^+sc33::SendInput, sc33
^+sc34::SendInput, sc34
^+sc35::SendInput, sc35
^+sc36::SendInput, sc36
^+sc37::SendInput, sc37
^+sc38::SendInput, sc38
^+sc39::SendInput, sc39
^+sc3A::SendInput, sc3A
^+sc3B::SendInput, sc3B
^+sc3C::SendInput, sc3C
^+sc3D::SendInput, sc3D
^+sc3E::SendInput, sc3E
^+sc3F::SendInput, sc3F
^+sc40::SendInput, sc40
^+sc41::SendInput, sc41
^+sc42::SendInput, sc42
^+sc43::SendInput, sc43
^+sc44::SendInput, sc44
^+sc45::SendInput, sc45
^+sc46::SendInput, sc46
^+sc47::SendInput, sc47
^+sc48::SendInput, sc48
^+sc49::SendInput, sc49
^+sc4A::SendInput, sc4A
^+sc4B::SendInput, sc4B
^+sc4C::SendInput, sc4C
^+sc4D::SendInput, sc4D
^+sc4E::SendInput, sc4E
^+sc4F::SendInput, sc4F
^+sc50::SendInput, sc50
^+sc51::SendInput, sc51
^+sc52::SendInput, sc52
^+sc53::SendInput, sc53
^+sc54::SendInput, sc54
^+sc55::SendInput, sc55
^+sc56::SendInput, sc56
^+sc57::SendInput, sc57
^+sc58::SendInput, sc58
^+sc59::SendInput, sc59
^+sc5A::SendInput, sc5A
^+sc5B::SendInput, sc5B
^+sc5C::SendInput, sc5C
^+sc5D::SendInput, sc5D
^+sc5E::SendInput, sc5E
^+sc5F::SendInput, sc5F
^+sc60::SendInput, sc60
^+sc61::SendInput, sc61
^+sc62::SendInput, sc62
^+sc63::SendInput, sc63
^+sc64::SendInput, sc64
^+sc65::SendInput, sc65
^+sc66::SendInput, sc66
^+sc67::SendInput, sc67
^+sc68::SendInput, sc68
^+sc69::SendInput, sc69
^+sc6A::SendInput, sc6A
^+sc6B::SendInput, sc6B
^+sc6C::SendInput, sc6C
^+sc6D::SendInput, sc6D
^+sc6E::SendInput, sc6E
^+sc6F::SendInput, sc6F
^+sc70::SendInput, sc70
^+sc71::SendInput, sc71
^+sc72::SendInput, sc72
^+sc73::SendInput, sc73
^+sc74::SendInput, sc74
^+sc75::SendInput, sc75
^+sc76::SendInput, sc76
^+sc77::SendInput, sc77
^+sc78::SendInput, sc78
^+sc79::SendInput, sc79
^+sc7A::SendInput, sc7A
^+sc7B::SendInput, sc7B
^+sc7C::SendInput, sc7C
^+sc7D::SendInput, sc7D
^+sc7E::SendInput, sc7E
^+sc7F::SendInput, sc7F
^+sc80::SendInput, sc80
^+sc81::SendInput, sc81
^+sc82::SendInput, sc82
^+sc83::SendInput, sc83
^+sc84::SendInput, sc84
^+sc85::SendInput, sc85
^+sc86::SendInput, sc86
^+sc87::SendInput, sc87
^+sc88::SendInput, sc88
^+sc89::SendInput, sc89
^+sc8A::SendInput, sc8A
^+sc8B::SendInput, sc8B
^+sc8C::SendInput, sc8C
^+sc8D::SendInput, sc8D
^+sc8E::SendInput, sc8E
^+sc8F::SendInput, sc8F
^+sc90::SendInput, sc90
^+sc91::SendInput, sc91
^+sc92::SendInput, sc92
^+sc93::SendInput, sc93
^+sc94::SendInput, sc94
^+sc95::SendInput, sc95
^+sc96::SendInput, sc96
^+sc97::SendInput, sc97
^+sc98::SendInput, sc98
^+sc99::SendInput, sc99
^+sc9A::SendInput, sc9A
^+sc9B::SendInput, sc9B
^+sc9C::SendInput, sc9C
^+sc9D::SendInput, sc9D
^+sc9E::SendInput, sc9E
^+sc9F::SendInput, sc9F
^+scA0::SendInput, scA0
^+scA1::SendInput, scA1
^+scA2::SendInput, scA2
^+scA3::SendInput, scA3
^+scA4::SendInput, scA4
^+scA5::SendInput, scA5
^+scA6::SendInput, scA6
[/more]


Добавлено:

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


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


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



А я и не знал, что теперь в ANSI. Ну, BOM так BOM. Спасибо!
Автор: oshizelly
Дата сообщения: 13.11.2012 22:10
Очередной вопрос чайника. Как сделать, чтобы хоткей активировал окно приложения, допустим, того же Total Commander, если это приложение уже запущено, а если не запущено, то запускал бы его? Как сделать каждую команду по отдельности, вроде бы понятно, но хочется, чтобы выбор нужного варианта производился автоматически.
Внятного ответа в доступных источниках не нашёл.
Спасибо!
Автор: Quasus
Дата сообщения: 13.11.2012 22:49
Квик’н’дёрти:


Код:
ActivateOrRun(WinTitle, Path)
{
If (WinExist(WinTitle))
WinActivate
Else
Run, %Path%
}

SetTitleMatchMode, 2
TCTitle = Total Commander
TCPath = %ProgramFiles%\Total Commander\blah-blah
ActivateOrRun(TCTitle, TCPath)
Автор: oshizelly
Дата сообщения: 13.11.2012 23:13
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)
Автор: Quasus
Дата сообщения: 13.11.2012 23:24
Это просто потому что описание функции попало в горячую клавишу. Если его в начало скрипта переместить, работает. (Я функцию запилил, чтобы было не совсем уж дёрти.)
Автор: oshizelly
Дата сообщения: 13.11.2012 23:42
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)
Автор: Quasus
Дата сообщения: 13.11.2012 23:47
С комментарием всё нормально. Дело в функции. Она начинается со слова ActivateOrRun и заканчивается скобкой }. Определять функцию внутри горячей клавиши как-то неестественно. Справка рекомендует функции определять в начале скрипта.

В вашем случае достаточно переставить строку +^!T:: после }, и заработает. Хотя для порядка неплохо бы в конце написать Return, завершающий многострочный хоткей.
Автор: oshizelly
Дата сообщения: 14.11.2012 00:03
Quasus 23:47 13-11-2012
Цитата:
С комментарием всё нормально. Дело в функции. Она начинается со слова ActivateOrRun и заканчивается скобкой }. Определять функцию внутри горячей клавиши как-то неестественно. Справка рекомендует функции определять в начале скрипта.

Тёмные мы, нормальных слов не понимаем
Теперь заработало

Правда, всё равно есть небольшая неувязка. У меня в системе имеется 2 разных Total Commander, у каждого совершенно разные настройки и сферы применения, причём запущены обычно оба. Я рассчитывал, что данный скрипт будет выводить, на передний план или запускать именно того TC, который живёт по явно указанному адресу TCPath = C:\Program Files\TotalCmd 8.0\TOTALCMD.EXE. Но вместо этого выводится на передний план окно того TC, которое позже было активно. Даже если "наш" TC вообще не запущен, то скрипт не запускает его, а выводит на передний план окно второго TC. Это уже никак не лечится?
Автор: OnMyDSeeAtAll
Дата сообщения: 14.11.2012 04:50
@oshizelly Вы опишите в чём они имеют разницу?, просто не понятно по какому критерию их отличать, чтобы пользаваться горячей клавишей в отношении нужного. Варианты: время запуска, версия, полный путь, если в одной папке и одной версии, то дата создания, размер файла, отличие можно найти. А самое главное, информацию в точности донести сюда!), это ускорит достижение конечного результата.
Автор: oshizelly
Дата сообщения: 14.11.2012 10:00
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.
Да, версии тоже разные, но это временно, всё никак не соберусь второй обновить.
Время запуска случайное.
Автор: Quasus
Дата сообщения: 14.11.2012 11:58
oshizelly, описываемые вами эффекты ожидаемы. Предложенный мной скрипт использует для идентификации окна ни больше ни меньше чем заголовок окна.

Мне кажется, проще всего было бы отдать запуск TC на откуп скрипту. Тогда скрипт знал бы, какое окно чьё, и какого окна не хватает если не хватает. Это несложно сделать через pid, попозже напишу. При этом запуск TC через скрипт не является ограничительным для пользователя, потому что, например, его ярлыки можно перенаправить на скриптики, которые бы отправляли главному скрипту сообщение, что нужно запускать (с помощью PostMessage).
Автор: oshizelly
Дата сообщения: 14.11.2012 12:22
Quasus 11:58 14-11-2012
Цитата:
Мне кажется, проще всего было бы отдать запуск TC на откуп скрипту... Это несложно сделать через pid, попозже напишу.

Это смотря кому несложно Конечно, так было бы логично.
Автор: Quasus
Дата сообщения: 14.11.2012 22:53

Код:
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)
Автор: oshizelly
Дата сообщения: 14.11.2012 23:12
Quasus 22:53 14-11-2012
Цитата:
Вот это вроде работает. «Мясо» здесь — функция Show, которая проверяет наличие окна с заданным PID и активирует его, если оно существует; если не существует, запускает программу и сохраняет PID процесса.

Очередной раз спасибо!

Вот только не совсем понятно, что надо вписать сюда:

Код: SetTitleMatchMode, 2
TCPath1 = ...
TCPath2 = ...
Автор: OnMyDSeeAtAll
Дата сообщения: 14.11.2012 23:22

Код: Global procPath:="C:\Program Files\TotalCmd 8.0\"
,
procName:="TOTALCMD.EXE"
,
query:="select Caption, ExecutablePath, Handle "
. "from Win32_Process "
. "where Caption='"
procName "'"

+^!
vk54::ActivateOrRun()

ActivateOrRun()
{
If (oWMI:=ComObjGet("winmgmts:").ExecQuery(query)).Count
For
colItem In oWMI
If colItem.ExecutablePath=procPath . procName
{
WinActivate,
% "ahk_pid"colItem.Handle
oWMI
:=""
Exit
}
Run,
% procName, % procPath
oWMI
:=""
}

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: как добавить ивритские шрифты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.