Тема: AHK: Скрипт для снятия скриншотов с автосортировкой
Скрипт извлекает различную информацию из активного окна и на основании нее определяет путь сохранения скриншота. Никаких запросов на сохранение - на несколько секунд выводится превью полученного скриншота с указанием папки сохранения и размеров изображения. Если в этот момент нажать Enter - файл откроется в выбранном редакторе, пробел - станет возможно преименование файла, Ctrl - откроется окно эксплорера для сохранения файла в другом месте.
Для всех видов скриншотов используется одна функция
St(type,path)
Здесь type - тип скриншота:
f - скриншот полного экрана
w - активного окна
s - выделенной области (выводится масштабируемое полупрозрачное окно; правый шелчок по нему - подтверждение выбора, Escape или правый щелчок вне его - отмена)
Возможные расширения скриншотов - bmp, jpg, png. Помимо постоянных значений, в пути возможно использование следующих переменных (примеры смотри в начале скрипта):
$date - подстрока вида 2014.12.22
$time - подстрока вида 18.54.30. Если ею не пользоваться, при совпадении имен производится автопереименование
$proc - имя процесса активного окна без расширения
$site - корневой адрес открытого в браузере сайта
$title - полный заголовок окна
$file - название или имя файла без расширения, взятое из заголовка окна (обрабатываются стандартные заголовки и полный путь файла, если он там есть)
$cmd - - имя файла без расширения, извлеченное из командной строки открытой вместе с файлом программы
$cmt - совмещающает возможности двух предыдущих: сначала ищется имя файла в командной строке, а если он отсутствует, используется заголовок окна
$z - использование в любом месте выводит краткий тултип подтверждения вместо превью
Для работы скрипта требуется присутствие в каталоге скрипта или в %PATH% nircmd.exe, который можно скачать здесь: http://www.nirsoft.net/utils/nircmd.html
Получить тонкий, эстетичный бордюр окна выделения на Windows 8+ можно с помощью Tiny Windows Borders: http://winaero.com/comment.php?comment.news.96
---------------------------
UPD: Смотри ниже улучшенный вариант на основе GDI+, не требующий nircmd.exe
UPD: Смотри ниже вариант со встроенным распознаванием текста на базе Tesseract-OCR
#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
#SingleInstance, force
Menu Tray, Icon, shell32.dll, 35
SetTitleMatchMode 2
SetTitleMatchMode Slow
CoordMode Mouse, Screen
; --------- Настройки ---------
color:="FFDC00" ; цвет окна выделения
transp:=150 ; его прозрачность (0-255)
sel:=80 ; его начальный размер
pr_time:=3 ; время показа превью, сек
tab:=3 ; число цифр c ведущими нулями при автопереименовании
ed_path:="D:\Soft\Chasys Draw IES\Artist.exe" ; путь к редактору
;------------------------------
<+PrintScreen::St("f","#Screenshots\$proc\$date-$time_$title.png") ; LShift+PrintScreen - скриншот всего экрана в папку процесса активного окна
#PrintScreen::St("w","#Screenshots\$proc\$date-$time_$title.png") ; Win+PrintScreen - скриншот активного окна в папку процесса активного окна
<^PrintScreen::St("s","#Screenshots\$proc\$date-$time_$title.png") ;LCtrl+PrintScreen - скриншот выделенной области в папку процесса активного окна
>^PrintScreen::St("s","#Files\$file\img.png") ;RCtrl+PrintScreen - скриншот выделенной области в папку открытого файла (для цитат электронных книг и пр.)
<^<+PrintScreen::St("s","#Sites\$site\$file.png") ;LCtrl+LShift+PrintScreen - скриншот выделенной области в папку открытого сайта с именем из заголовка страницы
>+PrintScreen::St("s","#Платежи\$site\$date\img.png") ;RShift+PrintScreen - скриншоты электронных платежей с сортировкой по сайтам и датам
>^>+PrintScreen::St("s","#Формы\[$site]-$file.png") ;RCtrl+RShift+PrintScreen - скриншоты регистрационных форм
; -----------------------------
<!PrintScreen::Run %s_path% ; LAlt+PrintScreen - открытие последнего скриншота
>!PrintScreen::Run %s_folder% ; RAlt+PrintScreen - открытие папки последнего скриншота
;------------------------------
St(type,f_path)
{
global
KeyWait Ctrl, T1
KeyWait Shift, T1
KeyWait Alt, T1
KeyWait PrintScreen, T1
tp:=type, fp:=f_path, z:=""
If (type="s") && select
goto End
FormatTime date, , yyyy.MM.dd
FormatTime time, , HH.mm.ss
WinGetActiveTitle t
WinGet proc, ProcessName, % t
SplitPath proc, , , , proc
StringUpper proc, proc, T
title:=ValidName(t)
file:=ValidName(CleanTitle(t))
cmd:=GetPath(t)
SplitPath cmd, , , ,cmd
If cmd
cmt:=cmd
else
{
cmt:=file
If f_path contains $cmd
{
MsgBox, 262160, Ошибка, Имя открытого файла недоступно!, 1.5
return
}
}
If f_path contains $site
{
Clipboard:=""
Send ^{vk4C}
Sleep 500
Send ^{vk43}
ClipWait 1
RegExMatch(Clipboard,"(?<=//).+?(?=/)",site)
If ! site
{
MsgBox, 262160, Ошибка, Адрес недоступен!, 1.5
return
}
}
If (type="s") && (select="")
{
MouseGetPos mx, my
Gui Destroy
Gui Color, % color
Gui +Lastfound +Resize AlwaysOnTop -Caption +ToolWindow -DPIScale
WinSet Transparent, % transp
Gui Show, x%mx% y%my% w%sel% h%sel%, selectwindow
select:=1
return
}
End:
StringReplace tag, tag, $site, % stag
StringReplace s_path, f_path, $date, % date
StringReplace s_path, s_path, $time, % time
StringReplace s_path, s_path, $proc, % proc
StringReplace s_path, s_path, $site, % site
StringReplace s_path, s_path, $title, % title
StringReplace s_path, s_path, $file, % file
StringReplace s_path, s_path, $cmd, % cmd
StringReplace s_path, s_path, $cmt, % cmt
StringReplace s_path, s_path, $z
If ! Errorlevel
z:=1
s_path:=RenIfExist(s_path,tab)
SplitPath s_path, , s_folder, s_ext, s_file
FileCreateDir % s_folder
If (type="f")
{
SysGet, M, Monitor
sw:=MRight
sh:=MBottom
RunWait % "nircmd.exe savescreenshot new." s_ext
}
If (type="w")
{
WinGetPos, , , sw, sh,% t
RunWait % "nircmd.exe savescreenshotwin new." s_ext
}
If (type="s")
RunWait % "nircmd.exe savescreenshot new." s_ext " " sx " " sy " " sw " " sh
FileMove % "new." s_ext,% s_path
FileGetSize sz,% s_path, K
If z
{
ToolTip Сохранено
Sleep 600
ToolTip
return
}
SplashImage % s_path, B1 ZW800 ZH-1 ZX20 ZY20 Fm14 Fs12 CW808080 CTFFFFFF C00,{Enter} - редактирование`n{Ctrl} - сохранить как`n{Space} - переименование файла" ,% "Папка: " s_folder "`nИмя: " s_file "." s_ext "`n" sw "x" sh " " sz " KB", preview
WinActivate preview
Sleep % pr_time*1000
SplashImage Off
select:=""
return
}
#IfWinActive selectwindow ahk_class AutoHotkeyGUI
RButton::
KeyWait RButton, T1
WinGetPos sx, sy, sw, sh, selectwindow
MouseGetPos mx, my
If (mx>sx && mx<sx+sw && my>sy && my<sy+sh)
{
Gui Destroy
St(tp,fp)
return
}
GuiEscape:
Gui Destroy
select:=""
Sleep 200
return
#IfWinActive preview ahk_class AutoHotkey2
Space::
SplashImage Off
Sleep 500
;~ Rename:
InputBox s_file, Переименование, Введите имя файла без расширения:, , 500, 130, , , , ,% s_file
s_file:=ValidName(s_file)
s_path_new:=RenIfExist(s_folder "\" s_file "." s_ext,1)
;~ IfExist % s_path_new
;~ goto Rename
FileMove % s_path, % s_path_new
s_path:=s_path_new
return
Enter::
NumpadEnter::
SplashImage Off
Run % ed_path " " s_path
return
Ctrl::
SplashImage Off
FileSelectFile s_path_new, S, % s_file "." s_ext, Выберите место сохранения, Изображения (*.bmp; *.jpg; *.png)
FileMove % s_path, % s_path_new
s_path:=s_path_new
SplitPath s_path, , s_folder
return
Esc::SplashImage Off
#IfWinActive
;-----------------------------
CleanTitle(t)
{
RegExMatch(t,"(?<=\)\.+?(?=\.[a-zA-Z0-9]{2,4}(]| |$|\}))",title)
If ! title
RegExMatch(t,"(?<=\[).+\.[a-zA-Z0-9]{2,4}(?=])",title)
If ! title
RegExMatch(t,"^.+\.[a-zA-Z0-9]{2,4}(?=( - | \| ))",title)
If ! title
RegExMatch(t,"(?<= - ).+\.[a-zA-Z0-9]{2,4}$",title)
SplitPath title, , , ,title
If ! title
RegExMatch(t,"^.+(?= - )",title)
If ! title
title:=t
return title
}
GetPath(title)
{
WinGet pr, ProcessName, % title
Process, Exist, % pr
pid := ErrorLevel
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
If (process.ProcessId = pid)
cmdline := process.CommandLine
If cmdline contains Explorer.exe
cmdline:=""
fp:=RegExMatch(cmdline,"[A-Z]:\\.*\.[a-zA-Z0-9]{2,4}",f_path,6)
return f_path
}
RenIfExist(f_path,tab)
{
If ! FileExist(f_path)
return f_path
SplitPath f_path, , dir, ext, file
Loop % dir "\" file "*." ext
{
n:=0
RegExMatch(A_LoopFileName,"(?<=_)\d+?(?=\.[a-zA-Z0-9]{2,4}$)",n)
If ! n
n_max:=0
If (n>n_max)
n_max:=n
}
SetFormat float, % "0" tab
return dir "\" file "_" n_max+1.0 "." ext
}
ValidName(n,r="")
{
n:=RegExReplace(n,"(:|;|,|\*|\?|\\|/|<|>|"")"," ")
n:=RegExReplace(n,"\s+"," ")
StringReplace n, n, |, -, All
If r
StringReplace n, n, % " ", % r
return Trim(n)
}