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

» Sumatra PDF / SumatraPDF

Автор: Krot66
Дата сообщения: 07.03.2016 15:07
Скрипт Autohotkey для SumatraPDF
Помимо добавления удобств в аскетичный интерфейс программы, скрипт позволяет использовать ее для разгребания книжных завалов: возможно перемещение по горячим клавишам внутри папки, быстрое переименование на основании выделенного текста, копирование открытых документов в буфер и в заданную папку, а так же их удаление.

Возможности:
У левого края экрана:
    Левый клик (или Alt+Up) - боковая панель закладок
    Правый (или Alt+Down) - боковая панель избранного
    Средний - добавить текущую позицию в избранное. В имя автоматически подставляется выделенный обычным или "оконным" способом текст (встроенная функция подстановки глючит очень часто)

У верхнего края экрана:
    Правый клик - свойства файла
    Средний (или Ctrl+O) - увеличенное окно открытия файла с подсветкой текущего, автоматическим выбором детального просмотра и перемещением на один уровень вверх по нажатию средней кнопки мыши
    Sift+правый клик - показывает и прячет панель инструментов. Скрипт выводит плавающее окошко в левом нижнем углу окна программы с указанием текущей страницы и их общего числа (в полноэкранном режиме показывается и время), так что панель как правило можно скрыть - она лишь зря занимает место и угнетает взгляд.

У правого края экрана:
    Правый клик (или Ctrl+Space) - плавающая панель на несколько секунд отображает размер и имя текущего файла
    Средний клик (или Ctrl+Enter) - полноэкранный режим
    Shift+средний клик - презентация
    Колесико - поэкранная прокрутка

На плавающем окне страниц:
    Левый клик - назавние и размер файла
    Правый - окно выбора страницы

Браузерное:
    Переключение вкладок колесиком с зажатой правой кнопкой мыши
    Щелчок левой кнопкой мыши с зажатой правой - переход назад
    Шелчок правой кнопкой мыши с зажатой левой - переход вперед

F1 - вызов справки
Shift+Tab - дублирование текущей вкладки (удобно для чтения примечаний в pdf и djvu)
Shift+F2 - переименование документа из выделенного текста
Alt+F3 - просмотр документа в первом из настроенных альтернативных вьюверов
Alt+F4 - просмотр документа во втором из настроенных альтернативных вьюверов
Alt+C - копирование открытого файла в буфер
Ctrl+Shift+S - сохранение копии файла в папку "_Read" в корне диска запущенного скрипта
Alt+PgUp/PgDn, Alt+WheelUp/WheelDown - перемещение по поддерживаемым файлам в папке с сортировкой по расширениям
Ctrl+Alt+PgUp/PgDn, Ctrl+Alt+WheelUp/WheelDown - то же, но файлы будут открываться в отдельных вкладках, без их закрытия (можно быстро открыть множество файлов)
Alt+Home, Alt+End - открытие первого и последнего файла папки
Ctrl+Del - закрытие вкладки и удаление файла в корзину. При секундном зажатии Ctrl - переход к следующему файлу

ВАЖНО:
1. В настройках программы (Настройки - Параметры), как и по умолчанию, должно быть включено использование вкладок.

2. Необходимо в файле настроек (Меню - Настройки - Расширенные настройки) выставить отображение в заголовке полного пути: FullPathInTitle = true.

3. Скрипт предполагает использование только стандартного интерфейса (FixedPageUI), но не двустраничного книжного (EbookUI). Поэтому при использовании SumatraPDF с форматами, отличными от pdf, djvu и xps, в том же файле настроек в разделе EbookUI должно стоять UseFixedPageUI=true.

[more=Скрипт]
Код:

#NoEnv
#NoTrayIcon
#SingleInstance, force
SetWorkingDir %A_ScriptDir%
SetTitleMatchMode, 2
SetTitleMatchMode, Slow
;~ SetKeyDelay 50, 50
goto start

/*
Возможности:

У левого края экрана:
    Левый клик (или Alt+Up) - боковая панель закладок
    Правый (или Alt+Down) - боковая панель избранного
    Средний - добавить текущую позицию в избранное. В имя автоматически подставляется выделенный обычным или "оконным" способом текст (встроенная функция подстановки глючит очень часто)

У верхнего края экрана:
    Правый клик - свойства файла
    Средний (или Ctrl+O) - увеличенное окно открытия файла с подсветкой текущего, автоматическим выбором детального просмотра и перемещением на один уровень вверх по нажатию средней кнопки мыши
    Sift+правый клик - показывает и прячет панель инструментов. Скрипт выводит плавающее окошко в левом нижнем углу окна программы с указанием текущей страницы и их общего числа (в полноэкранном режиме показывается и время), так что панель как правило можно скрыть - она лишь зря занимает место и угнетает взгляд.

У правого края экрана:
    Правый клик (или Ctrl+Space) - плавающая панель на несколько секунд отображает размер и имя текущего файла
    Средний клик (или Ctrl+Enter) - полноэкранный режим
    Shift+средний клик - презентация
    Колесико - поэкранная прокрутка

На плавающем окне страниц:
    Левый клик - назавние и размер файла
    Правый - окно выбора страницы

Браузерное:
    Переключение вкладок колесиком с зажатой правой кнопкой мыши
    Щелчок левой кнопкой мыши с зажатой правой - переход назад
    Шелчок правой кнопкой мыши с зажатой левой - переход вперед

F1 - вызов справки
Shift+Tab - дублирование текущей вкладки (удобно для чтения примечаний в pdf и djvu)
Shift+F2 - переименование документа из выделенного текста
Alt+F3 - просмотр документа в первом из настроенных альтернативных вьюверов
Alt+F4 - просмотр документа во втором из настроенных альтернативных вьюверов
Alt+C - копирование открытого файла в буфер
Ctrl+Shift+S - сохранение копии файла в папку "_Read" в корне диска запущенного скрипта
Alt+PgUp/PgDn, Alt+WheelUp/WheelDown - перемещение по поддерживаемым файлам в папке с сортировкой по расширениям
Ctrl+Alt+PgUp/PgDn, Ctrl+Alt+WheelUp/WheelDown - то же, но файлы будут открываться в отдельных вкладках, без их закрытия (можно быстро открыть множество файлов)
Alt+Home, Alt+End - открытие первого и последнего файла папки
Ctrl+Del - закрытие вкладки и удаление файла в корзину. При секундном зажатии Ctrl - переход к следующему файлу

ВАЖНО:

1. В настройках программы (Настройки - Параметры), как и по умолчанию, должно быть включено использование вкладок.

2. Необходимо в файле настроек (Меню - Настройки - Расширенные настройки) выставить отображение в заголовке полного пути: FullPathInTitle = true.

3. Скрипт предполагает использование только стандартного интерфейса (FixedPageUI), но не двустраничного книжного (EbookUI). Поэтому при использовании SumatraPDF с форматами, отличными от pdf, djvu и xps, в том же файле настроек в разделе EbookUI должно стоять UseFixedPageUI=true.
*/

/*
Как создать скомпилированную версию скрипта, включающую в себя SumatraPDF и не требующую установки Autohotkey (этот вариант Суматры полностью функционален, т.е. подхватывает настройки, открывет ассоциированные файлы и автоматически выгружается из памяти при закрытии окна программы).

1. Настраиваем под себя скрипт и помещаем его в каталог с Суматрой. Скрипт может называться как угодно, но не SumatraPDF.ahk! Сюда же помещаем файл help.txt с предполагаемой справкой, взятой из начала скрипта.

2. Идем в Программы - Autohotkey и запускаем "Convert .ahk to .exe".

3. Открываем в нем скрипт и подходящую иконку, например извлеченную из самой Суматры программой типа Greenfish Icon Editor Pro.

4. Компилируем, выбрав в выпадающем меню соответствующую версию Autohotkey (юникодную и той же разрядности, что и Суматра)

5. Удаляем старый файл Суматры и переименовываем полученный файл в SumatraPDF.exe
*/

start:

font:=14 ; размер шрифта панели страниц (0 - не показывать вообще)
file_show:=3000 ; время показа имени файла в панели страниц (0 - не показывать вообще)
color:="4E8D8F" ; ее цвет
conf:=1 ; подтверждать удаление файлов

;-----------------------------------------
FileInstall SumatraPDF.exe, _SPDF.exe
FileInstall help.txt, _help.txt
SplitPath A_ScriptDir, , , , , script_drive
working_file:="SumatraPDF.exe"
If A_IsCompiled
{
    file:=""
    If %1%
        file="%1%"
    Run _SPDF.exe %file%, %A_ScriptDir%
    WinWait ahk_class SUMATRA_PDF_FRAME
    WinActivate
    FileRead help, _help.txt
    working_file:="_SPDF.exe"
}
else
{
    FileRead help,% A_ScriptName
    RegExMatch(help,"s)/\*\K.+?(?=\*/)",help)
    Menu, Tray, Icon
    Menu, Tray, Icon, shell32.dll, 14
}

SysGet, M, MonitorWorkArea
Loop
{
    WinGetTitle st, ahk_class SUMATRA_PDF_FRAME
    RegExMatch(st,"^[a-zA-Z]:\\.+?\.\w{2,4}(?= - )",sf)
    If WinActive("ahk_exe " working_file) && sf
    {
        If (sf!=sf_old)
        {
            show:=1, sf_old:=sf
            SetTimer Show, % file_show
        }
        SplitPath sf, sfn, sd, sfext
        WinGetText stxt, ahk_class SUMATRA_PDF_FRAME
        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)) && font
        {
            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
    Process Exist, _SPDF.exe
    If !Errorlevel && A_IsCompiled
    {
        Sleep 1000
        WinClose Help ahk_class AutoHotkeyGUI
        FileDelete _SPDF.exe
        FileDelete _help.txt
        ExitApp
    }
    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}

F1::
SysGet, M, MonitorWorkArea
hw:=MRIght*0.9, hh:=MBottom*0.9
Gui 99:Destroy
Gui 99:-DPIScale
Gui 99:font, s16, Arial
Gui 99:Margin, 0, 0
Gui 99:Add, Edit, w%hw% h%hh%
Gui 99:Show, Center, Help
GuiControl 99:,Edit1, % help
return

!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 " working_file
ControlSetText Edit1, % sf
ControlSend Button1, {Enter}
return

^vk4F::
KeyWait Ctrl, T1
KeyWait vk4F, T1
Send ^{vk4F}
WinWaitActive % "ahk_class #32770 ahk_exe " working_file
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::
!WheelUp::
!WheelDown::
^!PGUP::
^!PGDN::
^!WheelUp::
^!WheelDown::
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,!WheelUp,^!WheelUp
    open:=prev, text:="Первый файл папки!"
If (A_ThisHotkey="!Home")
    open:=home, text:="Открыто!"
If (A_ThisHotkey="!End")
    open:=end, text:="Открыто!"
If A_ThisHotkey~="Del"
{
    WinGetActiveTitle cl_tab
    Send ^{vk57}
    WinWaitNotActive % cl_tab, , 2
    Sleep 100
    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,^!
{
    WinGetActiveTitle cl_tab
    Send ^{vk57}
    WinWaitNotActive % cl_tab, , 2
}
WinGet sumatra, ProcessPath, A
Run "%sumatra%" "%open%"
return

^+vk53::SaveCopy(script_drive "\_Read")

SaveCopy(path)
{
    global
    KeyWait Ctrl, T1
    KeyWait Shift, T1
    KeyWait Alt, T1
    FileCreateDir % path
    Send ^{vk53}
    WinWaitActive % "ahk_class #32770 ahk_exe " working_file
    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 " working_file
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 " working_file)
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
}

Автор: VictorVG2
Дата сообщения: 07.03.2016 17:35
Krot66

Отлично. Как я понимаю к вашему скрипт причитается исполнятор AutoHotkey каковой у меня тащится на гвардейской скорости 8 байт/минуту. Вопрос один - размер скомпилированной как STANDALONE суматры примерно соизмерим с размером предлагаемого чуда кое сначала надо ставить чтобы превратить .AHK в .EXE и уговорить дядю разрешить его запуск. А кому в таком случае предъявлять верительные грамоты что сии пляски с бубном жизненно необходимы?
Автор: Krot66
Дата сообщения: 07.03.2016 17:55
Тут я не в курсах, бо не программист. У меня это работает со штатной Суматрой 3.1. К версии это добро вообще мало привязано, поскольку используется один и тот же мегалитический интерфейс, которым автор занимается только когда уже вообще нечего есть
Автор: VictorVG2
Дата сообщения: 07.03.2016 18:48
Krot66

Ну а я глянул - для работы скрипта нужен установленный в локальной копии ОС Autohotkey, а зачем его с собой таскать? У вас он стоит и скрипт работает, если его нет то и исполнять скрипт некому т.к. он написан на языке реализованном только в данном пакете. А мне он к примеру не нужен, но я что обязан его ставить для использования подобных вашему скриптов?

Добавлено:
И более того, лишний раз перепроверил, что как ваш скрипт не обзывай, но без интерпретатора AutoHotkey он игнорируется как самой ОС (естественно), так и суматрой. Разве что у вас он с интерпретатором AutoHotkey и суматрой скомпилен в единый SFX бинарник "движок + суматра". Тогда да, у человека не знающего что внутри, но видящего имя бинарника SumatraPDF.exe вряд ли возникнет вопрос о наличии зависимости, а вот в этот SFX создаваемый Ahk2Exe можно не только суматру включить, но и что-то совсем постороннее и последствия могут быть самыми разными. В морг!
Автор: Krot66
Дата сообщения: 07.03.2016 19:38
Autohotkey сама по себе ничего не ест и систему не уродует, а лишь добавляет файловую ассоциацию и несколько пунктов в меню оболочки. Запущенный скрипт - метров 10, едва ли более. Можно скачать портативную версию в одном экзешнике и передать ей путь к скрипту в качестве параметра. Можно для переносных нужд скомпилировать скрипт в исполняемый файл (команда Compile Script контекстного меню). Наконец можно добавить после 3-й строки скрипта строку

Код: Run SumatraPDF.exe
Автор: VictorVG2
Дата сообщения: 07.03.2016 20:19
Krot66

Проверял, видел, но давайте не будем плодить сущности. AutoHotkey это лишняя сущность, вдобавок не столь и безобидная как вам кажется. Описывая своё предложение вы про это умолчали, а значит ваше предложение не доработано, и посему его - В морг!©zg без анализа достоинств и недостатков.

Любое техническое решение должно опираться на:

а) доступные средства целевой системы или минимальные изменения в ней не ухудшающие её характеристик;
б) чётко продуманное Техническое Задание (ТЗ);
в) исключать любые побочные эффекты от своего внедрения.

если данные условия не соблюдены решение отвергается. Это закон техники. Если кому-то он не нравится это не отменяет его действия.
Автор: maK
Дата сообщения: 07.03.2016 20:38
script x32-x64.exe
Автор: wvxwxvw
Дата сообщения: 07.03.2016 21:20
SumatraPDF.3.2.port+AHKscriptKrot.7z
Автор: dev2null
Дата сообщения: 07.03.2016 22:18
По древнему вопросу:
19:41 08-11-2014
Цитата:
Не хотят.. И не видят в этом проблемы..

ADMIN@CRACK мне тогда прислал патч для отключения этой фичи (т. е. чтобы настройки всегда были рядом с SumatraPDF.exe), на днях попался на глаза - немного допилил его - добавил поддержку x64. Правда, на мой взгляд, это не нужно, потому что скорее фича, чем баг (например, при отсутствии прав доступа к папке суматры, настройки не будут сохраняться, соппсно поэтому это и запилили), но может кому пригодится: http://www.upload.ee/files/5627247/sumatrapdf.v3.x.x86-x64.portable-fix.zip.html
Автор: maK
Дата сообщения: 07.03.2016 23:29
dev2null
пригодится ... не пригодится, а запас, как известно ...
Автор: VictorVG2
Дата сообщения: 07.03.2016 23:36
dev2null
maK

Енто точно, сохраню и для себя - вдруг да понадобится?
Автор: Krot66
Дата сообщения: 09.03.2016 12:22
Исправил в скрипте ошибку с индикацией номеров страниц
Автор: wvxwxvw
Дата сообщения: 09.03.2016 13:41
Krot66
Вот для этого что то еще настраивать надо? А то у меня не работает на 8.1 x64.

Цитата:
Правый клик (или Ctrl+Space) - плавающая панель на несколько секунд отображает размер и имя текущего файла


SumatraPDF.3.2.port+AHKscriptKrot66.(09-03-2016).7z
Автор: Krot66
Дата сообщения: 09.03.2016 15:06
wvxwxvw
Нет, никаких настроек не требуется. У меня на Win 8.0x64 все работает, так что тут что-то конфликтует на уровне горячих клавиш. Вот вариант с Alt+Space - это горячая клавиша Windows, и ее действие должно просто перекрываться
[more=Скрипт]
Код:
#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
}
Автор: VictorVG2
Дата сообщения: 09.03.2016 15:18
Krot66

Знаете, есть одно разумное правило - не перекрывать хоткеи и команды управления приложения своими, особенно коли они не имеют альтернативы. Перекрыли и часть фукционала ушла в /dev>nul. Но видимо это правило не для вас, понимаю. Сравните свой подход и к примеру это (посмотрите macro.txt, *.lua и справку).
Автор: Krot66
Дата сообщения: 09.03.2016 16:41
Ничего страшного в этом нет - хоткеи привязаны к окну Суматры и больше никуда не лезут. Просто бывает что Autohotkey не может перекрыть глобальные клавиши сторонних программ
Автор: VictorVG2
Дата сообщения: 09.03.2016 17:50
Krot66

Ну, если так, то это да, проще. Просто я хорошо помню историю когда Photoshop до версии CS4 включительно глобально перехватывал ESC и что из этого вышло. А Адобе да, лет через несколько ошибку сквозь зубы признала и устранила, а до того если в памяти находилась задача PS, то многие другие программы просто переставали работать. Потому я считаю что если приложение перепрограммируется пользователем, то это должно делаться исключительно в рамках его текущей задачи раз, исключительно его встроенными средствами два, и естественно без влияния на любые иные задачи - три. Иначе такие "средства" применимы только как разовая учебная задача.
Автор: Krot66
Дата сообщения: 19.03.2016 20:52
SumatraPDF_ahk - версия со встроенным скриптом, не требующая установки Autohotkey
(Описание возможностей и скрипт смотри здесь)

Для удобства портативного использования, а также людей далеких от Autohotkey, решил сделать скомпилированные версии портативной SumatraPDF. Этот вариант Суматры полностью функционален, т.е. подхватывает настройки, открывет ассоциированные файлы и автоматически выгружается из памяти при закрытии окна программы. Запуск прогаммы чуть более медленный, но если ее разрядность соответствует разрядности оси, это почти незаметно.

Скрипт соответствующим образом обновлен, и, помимо некоторых улучшений и исправлений, в него добавлен вызов справки по дополнительным возможностям программы нажатием F1. Инструкция для самостоятельного изготовления такой Суматры вписана в скрипт.

Готовые файлы можно скачать здесь
Автор: presentRU_tmp
Дата сообщения: 16.04.2016 15:31
Запуск нескольких окон (копий программы) в Sumatra предусмотрен?
Автор: The Unforgiven
Дата сообщения: 16.04.2016 15:38
presentRU_tmp
Нужно снять галку с Настройки - Параметры - Использовать вкладки (Settings - Options - Use tabs).
Автор: presentRU_tmp
Дата сообщения: 16.04.2016 15:49

Цитата:
Нужно снять галку с Настройки - Параметры - Использовать вкладки
Работает. Но как быть, если мне и вкладки нужны и несколько окон?
Автор: Krot66
Дата сообщения: 16.04.2016 15:50
presentRU_tmp
Это не предусмотрено
Автор: uzeerpc
Дата сообщения: 17.04.2016 17:07
Подскажите, в последней версии исправлен ли баг, когда при ассоциации файлов, DjVu-файл имел желтый ярлык суматры, но подписан как .pdf (на самом ярлыке)? Т.е. для DjVu-файла нет своего ярлыка?
Автор: Krot66
Дата сообщения: 17.04.2016 18:46
Это не баг - программа не назначает отдельные картинки расширениям. Они все получают иконку самой Суматры...
Автор: uzeerpc
Дата сообщения: 17.04.2016 19:31
Krot66, печально...
Автор: Ohlamon
Дата сообщения: 28.05.2016 12:27
Кто знает, подскажите, пожалуйста! Как включить выделение и копирование текста? В файлах pdf работает. А в файлах mobi, epub, fb2 не работает.
Автор: Krot66
Дата сообщения: 28.05.2016 12:59
Да так и работает: либо простым перетаскиванием мыши с зажатой левой кнопкой, либо выделением рамкой с зажатым Ctrl. А после Ctrl+C или контекстное меню...
Автор: Ohlamon
Дата сообщения: 28.05.2016 13:03
Спасибо!
Заработало только после внесения изменений в Settings - Advanced Options - Paragraph EbookUI - UseFixedPageUI = true
Но, теперь не такой веселенький интерфейс.
Автор: papanja_084
Дата сообщения: 28.05.2016 13:15

Цитата:
печально...

А по мне, так лучше не иметь лишних программ, всё равно в метаданных видно какое расширение имеет файл http://i80.fastpic.ru/big/2016/0528/0d/18be5e111b73938189d4dedc2c5a690d.png
Автор: VictorVG4
Дата сообщения: 30.05.2016 16:40
Поскольку rar подновился, то и unrar.dll до версии 5.40b2 подновил.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748

Предыдущая тема: c$


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