我想为右键单击>添加到档案...Windows 文件资源管理器中的 7z 功能。
这几乎与 AutoHotkey 配合使用:
#z::
SendInput {AppsKey}a{Enter}
Return
确实APPSKEY,有时A是可以的:
但有时不行,例如当选定的文件是一个文件夹时:
其中将为字母“A”选择另一个菜单项(此处为“添加到 MPC-HC 播放列表”)。
重要笔记:
我可以在
regedit.exe
各种上下文菜单项中手动找到文件、文件夹、每个可能的文件扩展名(可能的扩展名太多了!),但这太长了……不是吗?()我已经尝试过“级联上下文菜单”适用于 7z(可在7z 文件管理器 > 工具 > 选项... > 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
编辑
如果我们选择多个文件进行 ZIP,这应该可以工作:
#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