Опять выхожу на связь.
Немного усовершенствовал скрипт
; Замена запущенной программы
#SingleInstance force
; Читаем значение из реестра скрыты ли расширения типов файлов.
; Нужно для корректного добавления текста в конец имени.
RegRead,HideFileExt,HKEY_CURRENT_USER,Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced, HideFileExt
; Создаем группу с окнами сохранений.
GroupAdd, SaveDialog,Save As ahk_class #32770
GroupAdd, SaveDialog,Сохранение ahk_class #32770
GroupAdd, SaveDialog,Сохранить как ahk_class #32770
; SetTitleMatchMode, 2
; SendMode, input
GroupAdd, AllWindows
;GroupAdd, AllWindows,Program Manager ahk_class Progman
;GroupAdd, AllWindows,ahk_class CabinetWClass
loop
{
; ожидаем возможные окна.
WinWaitActive, ahk_group SaveDialog
;Окно найдено.
; В переменной ListSaveDialogOpened хрянятся id окон которые были уже открыты.
; Если переменная пустая, то условие хоть как истина.
; Иначе проверяем наличие id нового открытого окна в переменной.
; Если там этого id нет то условие истина.
;Функция WinActive() сразу же делает это окно по умолчанию для ahk подпрограмм.
;Оператор '~=' то же самое что и RegExMatch.
; (^|`|) означает что до начала номера id должно быть либо начало переменной, либо символ '|'
; ($|`|) означает что после номера id должно быть либо конец переменной, либо символ '|'
If ListSaveDialogOpened ? Not (WinActive("ahk_group SaveDialog") ~= ("(^|`|)" ListSaveDialogOpened "($|`|)") ) : true
{
;Окно нам подходит, теперь можно работать с ним.
; Так же добавим его id в переменную что бы в последующие разы игнорило.
ListSaveDialogOpened .= (ListSaveDialogOpened ? "|" : "") WinActive()
;Узнаем значение поля с именем файла. Заносим в переменную Text.
ControlGetText,Text,Edit1
; Если система показывает типы файлов, то в переменной Text убераем окончание и заносим в Extension.
IfEqual,HideFileExt,0,SplitPath,Text,,DirFile,Extension,Text
; Если переменная с типом файла не пуста, то в начале добавим точку.
IfNotEqual,Extension,,try Extension := "." Extension
; Нужно проверить есть ли дата в начале.
; Создаем переменную формата YYYYMMDD.
; YYYY - год. Четырехзначное значение(пример 2016)
; MM - Месяц. Двухзначное значение(пример 01)
; DD - День. Двухзначное значение(пример 01)
date := 20 . SubStr(Text,1,6)
; Если это условие ложь значит в начале нет даты.
if date is Not time
{
; Продолжаем если нет даты...
; Перезапишит переменную date с сегодняшним числом.
FormatTime, date,, yyMMdd
; Замена и сокращение символов.
Text := StrReplace(Text,"@","(A)")
Text := StrReplace(Text,"+","plus")
Text := SubStr(text,1,192)
; Новое значение Text будет равно "date + Text + свой текст + Extension".
Text := date . " " . Text . " @ + " . Extension
; Устанавливаем новый текст в контрол.
ControlSetText, Edit1, % Text
; EM_SETSEL это - сообщение для выделения текста в edit поле от определенного символа до другого.
; Функция InStr выдает позицию искомого текста(всегда начало слева), не учитывая регистр и поиск должен быть с конца.
SendMessage, 0xB1,% InStr(Text,"@",0,0) , % InStr(Text,"@",0,0),Edit1 ; EM_SETSEL
}
}
; Конец этого условия значит что все нужные манипуляции с окном сделаны.
;Ожидаем его деактивации из фокуса.
WinWaitNotActive
; Если окон сохранения больше вообще нет, то очищаем переменную.
If Not WinExist("ahk_group SaveDialog")
ListSaveDialogOpened := ""
; Если же окна сохранения еще существуют, то те с которым
; была работа будут игнорится в следующем цикле.
}
#IfWinActive ahk_group AllWindows
$F2::
i := k := 0
ControlGetFocus, Control, A
if InStr(Control, "Edit")
ControlGetText, FileName, %Control%, A
else
{
WinGet, ControlList, ControlList, A
Loop, parse, ControlList, `n
if InStr(A_LoopField, "Edit")
i++
;Send {F2}
Send, % "{" . SubStr(A_ThisHotkey, 2) . "}"
While k - i != 1
{
Sleep, 15
k := 0
WinGet, ControlList, ControlList, A
Loop, parse, ControlList, `n
if InStr(A_LoopField, "Edit")
k++
}
Control = Edit%k%
ControlGetText, FileName, %Control%, A
}
date := 20 . SubStr(FileName,1,6)
; SubStr (FileName,1,7) = " " ; проверка что после даты стоит пробел
if date is Not time ;todo добавить сюда доп. условие, после даты должен идти пробел
{
FormatTime, date,, yyMMdd
IfEqual,HideFileExt, 0,SplitPath,FileName, , ,Ext,FileName
IfNotEqual,Ext,,try Ext := "." Ext
oldFileName := Filename Ext
FileName := StrReplace(FileName,"@","(A)")
FileName := StrReplace(FileName,"+","plus")
FileName := SubStr(FileName,1,192)
FileName := date . " " . FileName . " @ + " . Ext
}
else
{
Filename := oldFileName
}
ControlSetText, %Control%, % FileName
SendMessage, 0xB1,% InStr(FileName,"@",0,0) , % InStr(FileName,"@",0,0),%Control% ; EM_SETSEL
Return
Теперь все в одном скрипте, добавил горячую клавишу. Вдохновлялся скриптом из коллекции "Выделение файла без расширения".
А проблема вот в чем, не могу отловить баг. Он появляется если в программе SynWrite (мой текстовый редактор) нажать F2 (и еще где-то не работает, но щас не помню). После этого скрипт зацикливается, я смотрел lines most recently executed, и перестает работать горячая клавиша и слежение за окнами сохранения. Не могу понять в чем дело?