Сочетание клавиш для 7z «Добавить в архив...»

Сочетание клавиш для 7z «Добавить в архив...»

Я хочу создать сочетание клавиш дляЩелкните правой кнопкой мыши > Добавить в архив...функция 7z в проводнике Windows.

Этотоколоработает с AutoHotkey:

#z::
    SendInput {AppsKey}a{Enter}
    Return

Действительно, APPSKEYиногда Aэто нормально:

введите описание изображения здесь

но иногда это не нормально, например, когда выбранный файл является папкой:

введите описание изображения здесь

для которого будет выбран другой пункт меню для буквы «А» (в данном случае «Добавить в плейлист MPC-HC»).

Важные заметки:

  • Я мог бы вручную найти в regedit.exeразличных пунктах контекстного меню файлы, папки, все возможные расширения файлов (слишком много возможных расширений!), но это было бы слишком долго... не правда ли? (*)

  • Я уже пробовал с«Каскадное контекстное меню»для 7z (это доступно в7z-File-manager > Инструменты > Параметры... > 7-Zipменю), но дела обстоят еще хуже. В зависимости от контекста буквы не совпадают, и тогда невозможно связать последовательную горячую клавишу

  • Решением было бы, чтобы 7z регистрировался, &Add to archive...а не только Add to archive...в контекстных меню. Если я правильно помню, &в настройках контекстного меню regedit есть то, что помогает контекстному меню использовать сочетание клавиш. Есть ли для этого опция? К сожалению, это, похоже, недоступно напрямую в 7-zip.


(*) Будет ли это возможно с несколькими regeditредакциями? т.е. заменить Add to archive...на &Add to archive? В скольких ключах/значениях это следует сделать? В:

HKEY_CLASSES_ROOT\Folder\ShellEx\ContextMenuHandlers\7-Zip

Я понимаю:

{23170F69-40C1-278A-1000-000100020000}

Может ли это быть полезным?

решение1

Попробуй это

#IfWinActive ahk_class CabinetWClass    ; explorer

    #z::
        ClipSaved := ClipboardAll       ; save the entire clipboard to the variable ClipSaved
        clipboard := ""                 ; empty the clipboard (start off empty to allow ClipWait to detect when the text has arrived)
        Send, ^c                        ; copy selected item
        ClipWait, 1                     ; wait for the clipboard to contain data 
        if (!ErrorLevel)                ; If NOT ErrorLevel ClipWait found data on the clipboard
        {
            ; MsgBox, %clipboard%       ; display the path
            FileGetAttrib A, %clipboard%
            if InStr(A, "D")            ; is a folder
                SendInput {AppsKey}aa{Enter}
            else                        ; is a file
                SendInput {AppsKey}a{Enter}
        }
        else
            MsgBox, No file selected
        Sleep, 300 
        clipboard := ClipSaved         ; restore original clipboard
        VarSetCapacity(ClipSaved, 0)   ; free the memory
    return

#IfWinActive

https://www.autohotkey.com/docs/commands/_IfWinActive.htm https://www.autohotkey.com/docs/misc/Clipboard.htm#ClipboardAll https://www.autohotkey.com/docs/commands/FileGetAttrib.htm

РЕДАКТИРОВАТЬ

Это должно сработать, если мы выберем несколько файлов для архивации:

#IfWinActive ahk_class CabinetWClass    ; explorer

    #z::
        folder := false
        file := false
        ClipSaved := ClipboardAll       ; save the entire clipboard to the variable ClipSaved
        clipboard := ""                 ; empty the clipboard (start off empty to allow ClipWait to detect when the text has arrived)
        Send, ^c                        ; copy selected item
        ClipWait, 1                     ; wait for the clipboard to contain data 
        if (!ErrorLevel)                ; If NOT ErrorLevel ClipWait found data on the clipboard
        {
            Loop, Parse, Clipboard, `n  ; split by linefeed
            {
                LoopField := trim(A_LoopField, "`r`n") ; trim CRs/LFs
                FileGetAttrib A, %LoopField%
                if InStr(A, "D")        ; is a folder
                    folder := true
                else                    ; is a file
                    file := true
            }
            if (folder) 
            {
                if (file)              ; folders and files
                    SendInput {AppsKey}a{Enter}
                else                   ; only folders
                    SendInput {AppsKey}aa{Enter}
            }
            else if (file)             ; only files     
                SendInput {AppsKey}a{Enter}
        }
        else
            MsgBox, No file selected
        Sleep, 300 
        clipboard := ClipSaved         ; restore original clipboard
        VarSetCapacity(ClipSaved, 0)   ; free the memory
    return
    
#IfWinActive

Связанный контент