#NoEnv #SingleInstance, force SetWorkingDir %A_ScriptDir% SetTitleMatchMode, 2 SetTitleMatchMode, Slow Menu, Tray, Icon, shell32.dll, 14 ;~ SetKeyDelay 50, 50 goto start /* Возможности: У левого края экрана: Левый клик (или Alt+Up) - боковая панель закладок Правый (или Alt+Down) - боковая панель избранного Средний - добавить текущую позицию в избранное. В имя автоматически подставляется выделенный обычным или "оконным" способом текст (встроенная функция подстановки глючит очень часто) У верхнего края экрана: Правый клик - свойства файла Средний (или Ctrl+O) - увеличенное окно открытия файла с подсветкой текущего, автоматическим выбором детального просмотра и перемещением на один уровень вверх по нажатие средней кнопки мыши Sift+правый клик - показывает и прячет панель инструментов. Скрипт выводит плавающее окошко в левом нижнем углу окна программы с указанием текущей страницы и их общего числа (в полноэкранном режиме показывается и время), так что панель как правило можно скрыть - она лишь зря занимает место и угнетает взгляд. У правого края экрана: Правый клик (или Alt+Space) - плавающая панель на несколько секунд отображает размер и имя текущего файла Средний клик (или Ctrl+Enter) - полноэкранный режим Shift+средний клик - презентация Колесико - поэкранная прокрутка На плавающем окне страниц: Левый клик - назавние и размер файла Правый - окно выбора страницы Браузерное: Переключение вкладок колесиком с зажатой правой кнопкой мыши Щелчок левой кнопкой мыши с зажатой правой - переход назад Шелчок правой кнопкой мыши с зажатой левой - переход вперед Shift+Tab - дублирование текущей вкладки (удобно для чтения примечаний в pdf и djvu) Shift+F2 - переименование документа из выделенного текста Alt+F3 - просмотр документа в первом из настроенных альтернативных вьюверов Alt+F4 - просмотр документа во втором из настроенных альтернативных вьюверов Alt+C - копирование открытого файла в буфер Ctrl+Shift+S - сохранение копии документа в заданной папке (можно назначить множество папок соответствующим клавишам - ниже приведен пример этого) Alt+PgUp, Alt+PgDn - перемещение по поддерживаемым файлам в папке с сортировкой по расширениям Ctrl+Alt+PgUp, Ctrl+Alt+PgDn - то же, но файлы будут открываться в отдельных вкладках, без их закрытия Alt+Home, Alt+End - открытие первого и последнего файла папки Ctrl+Del - закрытие вкладки и удаление файла в корзину. При секундном зажатии Ctrl - переход к следующему файлу ВАЖНО: Скрипт предполагает использование только стандартного интерфейса (FixedPageUI), но не двустраничного книжного (EbookUI). Поэтому при использовании SumatraPDF с форматами, отличными от pdf, djvu и xps, в файле дополнительных настроек (Настройки - Расширенные настройки) должно стоять UseFixedPageUI=true в разделе EbookUI. Необходимо также выставить отображение в заголовке полного пути: FullPathInTitle = true. В настройках программы (Настройки - Параметры), как и по умолчанию, должно быть включено использование вкладок . */ ^+vk53::SaveCopy("D:\Lib\_Read") ; Пример сохранения копии документа по Ctrl+Shift+S (путь абсолютный или относительный). start: font:=14 ; размер шрифта панели страниц (0 - не показывать вообще) file_show:=3000 ; время показа имени файла в панели страниц (0 - не показывать вообще) color:="4E8D8F" ; ее цвет conf:=1 ; подтверждать удаление файлов SysGet, M, MonitorWorkArea Loop { WinGetTitle st, ahk_class SUMATRA_PDF_FRAME RegExMatch(st,"^[a-zA-Z]:\\.+?\.\w{2,4}(?= - )",sf) If WinActive("ahk_exe SumatraPDF.exe") && sf && font { sf_old:=sf SplitPath sf, sfn, sd, sfext WinGetText stxt, ahk_class SUMATRA_PDF_FRAME ;~ RegExMatch(stxt,"m)^\d+$",pg) RegExMatch(stxt,"m)^[0-9XIVLC]+$",pg) RegExMatch(stxt,"m)/ \K\d+$",all_pg) If !all_pg RegExMatch(stxt,"/ ?\K\d+(?=\))",all_pg) pp:=pg " / " all_pg If show && file_show { FileGetSize sz, % sf, K pp.=" | " sfn " (" sz " KB)" } If (WinState("ahk_class SUMATRA_PDF_FRAME")=2 && !show) { FormatTime time, , HH:mm pp.=" | " time } ControlGetText pp_old, Static1, pages_window l:=StrLen(pp), l_old:=StrLen(pp_old) WinGetPos x, y, w, h, ahk_class SUMATRA_PDF_FRAME If !WinExist("pages_window") || (l!=l_old) { Gui Destroy Gui -Caption +ToolWindow -DPIScale +AlwaysOnTop +LastFound Gui Color, % color Gui Font, s%font% cffffff w700, Licida Console Gui Margin, 6, 2 Gui Add, Text, g!Space, % pp Gui Show, x10 y10 NA, pages_window WinGetPos, , , , hp } GuiControl Text, Static1, % pp WinMove, pages_window, ,x+12, y+h-hp-12 } else Gui Destroy Sleep 100 } #If WinActive("ahk_class SUMATRA_PDF_FRAME") !Up::Send {F12} !Down::PostMessage 0x111, 562, , , ahk_class SUMATRA_PDF_FRAME !F3::PostMessage 0x111, 500, , , ahk_class SUMATRA_PDF_FRAME !F4::PostMessage 0x111, 501, , , ahk_class SUMATRA_PDF_FRAME ^NumpadEnter:: ^Enter::Send {F11} !vk43:: FileToClipboard(sf) ToolTip Текст в буфере!, MRight//2-100, MBottom//2 Sleep 1000 ToolTip return !Space:: KeyWait Ctrl, T1 show:=1 SetTimer Show, % file_show return Show: SetTimer Show, Off show:=0 return +Tab:: Send ^{vk4F} WinWaitActive ahk_class #32770 ahk_exe SumatraPDF.exe ControlSetText Edit1, % sf ControlSend Button1, {Enter} return ^vk4F:: KeyWait Ctrl, T1 KeyWait vk4F, T1 Send ^{vk4F} WinWaitActive ahk_class #32770 ahk_exe SumatraPDF.exe Sleep 100 WinMove ahk_class #32770, , MRight//5, MBottom//20, MRight*0.6, MBottom*0.9 ControlSetText Edit1, % sd #32770 ControlSend Button1, {Enter} Sleep 100 ControlFocus DirectUIHWND2, ahk_class #32770 SendInput ^+6 Sleep 100 SendInput % sfn return +F2:: KeyWait Shift, T1 Clipboard:="" Send ^{vk43} ClipWait 1 e:=Errorlevel ren:=ValidName(Trim(Clipboard)) Clipboard:=FirstUppercase(RegExReplace(ren,"[.,]+$")) Send {F2} WinWaitActive ahk_class #32770 If e { ToolTip Ничего не скопировано!, MRight//2-100, MBottom//2 Sleep 1500 ToolTip return } Send {Del}^{vk56} ControlSend Edit1, {End} return ^Del:: ^NumpadDel:: KeyWait Ctrl, T0.8 e:=Errorlevel If !sf_old return If conf { MsgBox, 262179, , % "Удалить файл`n" sf_old " ?" IfMsgBox Yes goto !Home return } !Home:: !End:: !PGUP:: !PGDN:: ^!PGUP:: ^!PGDN:: start:=sf_old SplitPath start, , dir mask:="*.cb7z;*.cbr;*.cbt;*.cbz;*.chm;*.djv*;*.epub;*.*fb2;*.mobi;*.pdb;*.pdf;*.xps" n:=0, curr:=next:=prev:=end:="" Loop Parse, mask, `; { Loop Files, % dir "\" A_LoopField { n+=1 If (n=1) home:=A_LoopFileFullPath If (A_LoopFileFullPath=start) curr:=n, prev:=end If (n=curr+1) next:=A_LoopFileFullPath end:=A_LoopFileFullPath } } open:=next, text:="Последний файл папки!" If A_ThisHotkey in !PGUP,^!PGUP open:=prev, text:="Первый файл папки!" If (A_ThisHotkey="!Home") open:=home, text:="Открыто!" If (A_ThisHotkey="!End") open:=end, text:="Открыто!" If A_ThisHotkey~="Del" { Send ^{vk57} Sleep 500 FileRecycle % start If !e return } If (!open || open=start) { ToolTip % text, MRight//2-100, MBottom//2 Sleep 1000 ToolTip return } If A_ThisHotkey not contains Del,^! Send ^{vk57} WinGet sumatra, ProcessPath, A Run "%sumatra%" "%open%" WinWait % open show:=1 SetTimer Show, % file_show return SaveCopy(path) { global KeyWait Ctrl, T1 KeyWait Shift, T1 KeyWait Alt, T1 FileCreateDir % path Send ^{vk53} WinWaitActive ahk_class #32770 ahk_exe SumatraPDF.exe Clipboard:=RegExReplace(path,"\\$") "\" sfn Send {Del}^{vk56} Sleep 100 Send {Enter} return } #If WinActive("ahk_class SUMATRA_PDF_FRAME") && HoverControl()="Static1" RButton:: KeyWait RButton, T1 WinHide pages_window PostMessage 0x111, 434, , , ahk_class SUMATRA_PDF_FRAME return #If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(1) && WinState() LButton::Send {F12} RButton:: KeyWait RButton, T1 PostMessage 0x111, 562, , , ahk_class SUMATRA_PDF_FRAME return MButton:: KeyWait MButton, T1 Clipboard:="" Send ^{vk43} ClipWait 1 fav:=RegExReplace(Clipboard,"\s"," ") PostMessage 0x111, 560, , , ahk_class SUMATRA_PDF_FRAME WinWaitActive ahk_class #32770 ahk_exe SumatraPDF.exe If fav ControlSetText Edit1, % fav, ahk_class #32770 return #If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(0,1) && WinState() MButton::F11 RButton::goto !Space WheelUp:: WheelDown:: ControlGet c1, Visible, , SysTreeView321, A ControlGet c2, Visible, , SysTreeView322, A If c1 || c2 Send {%A_Thishotkey%} else { If (A_ThisHotkey="WheelUp") Send {PGUP} else Send {PGDN} } return #If WinActive("ahk_class SUMATRA_PDF_FRAME") && IsBorder(0,0,1) && WinState() RButton::^vk44 MButton::goto ^vk4F +RButton::PostMessage 0x111, 419, , , ahk_class SUMATRA_PDF_FRAME #If WinActive("ahk_class SUMATRA_PDF_FRAME") && !IsBorder(1,1,1,1) ~RButton & ~WheelDown::Send {Rbutton up}^{Tab} ~RButton & ~WheelUp::Send {Rbutton up}^+{Tab} ~RButton & ~LButton::Send {Rbutton up}!{Left} ~LButton & ~RButton::Send {LButton up}!{Right} #If WinActive("ahk_class #32770 ahk_exe SumatraPDF.exe") MButton::!Up #IfWinActive ;-------------------------------------------------- FileToClipboard(PathToCopy,Method="copy") { FileCount:=0 PathLength:=0 ; Count files and total string length Loop,Parse,PathToCopy,`n,`r { FileCount++ PathLength+=StrLen(A_LoopField) } pid:=DllCall("GetCurrentProcessId","uint") hwnd:=WinExist("ahk_pid " . pid) ; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40) hPath := DllCall("GlobalAlloc","uint",0x42,"uint",20 + (PathLength + FileCount + 1) * 2,"UPtr") pPath := DllCall("GlobalLock","UPtr",hPath) NumPut(20,pPath+0),pPath += 16 ; DROPFILES.pFiles = offset of file list NumPut(1,pPath+0),pPath += 4 ; fWide = 0 -->ANSI,fWide = 1 -->Unicode Offset:=0 Loop,Parse,PathToCopy,`n,`r ; Rows are delimited by linefeeds (`r`n). offset += StrPut(A_LoopField,pPath+offset,StrLen(A_LoopField)+1,"UTF-16") * 2 DllCall("GlobalUnlock","UPtr",hPath) DllCall("OpenClipboard","UPtr",hwnd) DllCall("EmptyClipboard") DllCall("SetClipboardData","uint",0xF,"UPtr",hPath) ; 0xF = CF_HDROP ; Write Preferred DropEffect structure to clipboard to switch between copy/cut operations ; 0x42 = GMEM_MOVEABLE(0x2) | GMEM_ZEROINIT(0x40) mem := DllCall("GlobalAlloc","uint",0x42,"uint",4,"UPtr") str := DllCall("GlobalLock","UPtr",mem) if (Method="copy") DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x05) else if (Method="cut") DllCall("RtlFillMemory","UPtr",str,"uint",1,"UChar",0x02) else { DllCall("CloseClipboard") return } DllCall("GlobalUnlock","UPtr",mem) cfFormat := DllCall("RegisterClipboardFormat","Str","Preferred DropEffect") DllCall("SetClipboardData","uint",cfFormat,"UPtr",mem) DllCall("CloseClipboard") return } FirstUppercase(t) { StringLeft n, t, 1 StringTrimLeft k, t, 1 StringUpper n, n return n . k } HoverControl() { MouseGetPos, , , , control return control } IsBorder(left:="",right="",top="",bottom:="",m=6) { SysGet, M, Monitor SysGet, W, MonitorWorkArea CoordMode Mouse MouseGetPos mx, my return If (((left && mx<m) && (my>50) && (my<WBottom)) || (right && mx>MRight-m) || (top && my<m) || (bottom && my>MBottom-m)) } ValidName(n,r="") { n:=RegExReplace(n,"(:|;|,|\.|\*|\?|\\|/|<|>|"")"," ") n:=RegExReplace(n,"\s+"," ") StringReplace n, n, |, -, All If r StringReplace n, n, % " ", % r, All return Trim(n) } WinState(t="A") { If !WinExist(t) || (t="A" && WinActive("Program Manager")) return SysGet, M, Monitor WinGetPos , , , w, h, % t WinGet st, MinMax, % t If (w=MRight && h=MBottom) st:=2 return st } |