AutoHotkey - 将热键发送到嵌套文件夹
AutoHotkey - send hotkeys to nested folders
使用 Autohotkey,我可以将“ctrl+”发送到 Windows 文件资源管理器,以自动调整列宽。
手动,它是 ctrl+(数字小键盘中的 +)。
下面的代码有效,但仅适用于一级文件夹,如果我在文件夹中打开文件夹则无效。
有没有办法为我可能打开的每个子文件夹再次发送“ctrl+”?
Gui, +LastFound
DllCall("RegisterShellHookWindow", UInt, WinExist())
MsgNum := DllCall("RegisterWindowMessage", Str, "SHELLHOOK")
OnMessage(MsgNum, "ShellMessage")
Return
ShellMessage(wParam, lParam) {
wTitle = ahk_id %lParam%
WinGet, pname, ProcessName, %wTitle%
If (wParam != 1 || pname != "Explorer.exe")
Return
WinActivate, %wTitle%
Send ^{NumpadAdd} ;ctrl+ (numpad)
}
似乎是一个非常有问题的方法。
我宁愿看到以某种方式将此设置为默认行为,或者使用 COM 自动执行此操作而不是发送热键。
无论如何,对于热键方法,这似乎可以解决问题:
;No need to create a gui, A_ScriptHwnd is used for this
DllCall("RegisterShellHookWindow", UInt, A_ScriptHwnd)
MsgNum := DllCall("RegisterWindowMessage", Str, "SHELLHOOK")
OnMessage(MsgNum, "ShellMessage")
Return
ShellMessage(wParam, lParam)
{
static _time := 0
if (wParam = 6 && A_TickCount - _time > 100 && WinActive("A") = lParam)
{
_time := A_TickCount
WinGet, pname, ProcessName, % "ahk_id " lParam
if (pname = "explorer.exe")
{
ControlFocus, DirectUIHWND2, % "ahk_id " lParam
SendInput, ^{NumpadAdd}
}
}
}
因此,首先放弃了为当前脚本获取 hwnd 的传统方式,并使用 A_ScriptHwnd
(docs).
此外,整体上放弃了遗留语法。
然后切换到 HSHELL_REDRAW
(docs) 事件以检查 window 标题更改。
计时的东西是过滤掉 duplicate shell 消息。当标题更改时,我们实际上会同时收到 10 多条这样的消息。只需要运行热键一次
所以一个简单的 100 毫秒冷却时间就可以了。
A_TickCount
(docs)就是用来干这个的
还使检查顺序更加智能。
如果我们甚至没有收到正确的 shell 消息,则无需获取进程名称。
最后,在发送热键之前,激活正确的控件以便热键起作用。如果您使用的是较旧或未来的 Windows 版本,这部分内容可能对您来说是错误的。
也切换到 SendInput
(docs) 因为它是推荐的更快更可靠的发送模式。
使用 Autohotkey,我可以将“ctrl+”发送到 Windows 文件资源管理器,以自动调整列宽。 手动,它是 ctrl+(数字小键盘中的 +)。
下面的代码有效,但仅适用于一级文件夹,如果我在文件夹中打开文件夹则无效。 有没有办法为我可能打开的每个子文件夹再次发送“ctrl+”?
Gui, +LastFound
DllCall("RegisterShellHookWindow", UInt, WinExist())
MsgNum := DllCall("RegisterWindowMessage", Str, "SHELLHOOK")
OnMessage(MsgNum, "ShellMessage")
Return
ShellMessage(wParam, lParam) {
wTitle = ahk_id %lParam%
WinGet, pname, ProcessName, %wTitle%
If (wParam != 1 || pname != "Explorer.exe")
Return
WinActivate, %wTitle%
Send ^{NumpadAdd} ;ctrl+ (numpad)
}
似乎是一个非常有问题的方法。
我宁愿看到以某种方式将此设置为默认行为,或者使用 COM 自动执行此操作而不是发送热键。
无论如何,对于热键方法,这似乎可以解决问题:
;No need to create a gui, A_ScriptHwnd is used for this
DllCall("RegisterShellHookWindow", UInt, A_ScriptHwnd)
MsgNum := DllCall("RegisterWindowMessage", Str, "SHELLHOOK")
OnMessage(MsgNum, "ShellMessage")
Return
ShellMessage(wParam, lParam)
{
static _time := 0
if (wParam = 6 && A_TickCount - _time > 100 && WinActive("A") = lParam)
{
_time := A_TickCount
WinGet, pname, ProcessName, % "ahk_id " lParam
if (pname = "explorer.exe")
{
ControlFocus, DirectUIHWND2, % "ahk_id " lParam
SendInput, ^{NumpadAdd}
}
}
}
因此,首先放弃了为当前脚本获取 hwnd 的传统方式,并使用 A_ScriptHwnd
(docs).
此外,整体上放弃了遗留语法。
然后切换到 HSHELL_REDRAW
(docs) 事件以检查 window 标题更改。
计时的东西是过滤掉 duplicate shell 消息。当标题更改时,我们实际上会同时收到 10 多条这样的消息。只需要运行热键一次
所以一个简单的 100 毫秒冷却时间就可以了。
A_TickCount
(docs)就是用来干这个的
还使检查顺序更加智能。
如果我们甚至没有收到正确的 shell 消息,则无需获取进程名称。
最后,在发送热键之前,激活正确的控件以便热键起作用。如果您使用的是较旧或未来的 Windows 版本,这部分内容可能对您来说是错误的。
也切换到 SendInput
(docs) 因为它是推荐的更快更可靠的发送模式。