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) 因为它是推荐的更快更可靠的发送模式。