【问题标题】:AutoHotkey - send hotkeys to nested foldersAutoHotkey - 将热键发送到嵌套文件夹
【发布时间】:2020-11-28 09:37:03
【问题描述】:

使用 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)
}

【问题讨论】:

    标签: autohotkey explorer


    【解决方案1】:

    似乎是一个非常值得怀疑的方法。
    我宁愿看到以某种方式将其设置为默认行为,或者使用 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) 事件来检查窗口标题的变化。
    时间安排是过滤掉 duplicate shell 消息。当标题改变时,我们实际上一次收到了 10 多条这样的消息。只需运行一次热键。
    所以一个简单的 100 毫秒冷却就可以了。
    A_TickCount (docs) 用于此目的。

    还使检查单更智能。
    如果我们甚至没有收到正确的 shell 消息,则无需获取进程名称。

    最后,在发送热键之前,激活正确的控件,这样热键才会起作用。如果您使用的是较旧或未来的 Windows 版本,这部分可能对您来说是错误的。
    也切换到SendInput (docs),因为它是推荐的更快和更可靠的发送模式。

    【讨论】:

    • 0x464e,非常感谢!您的代码完美运行。看到这种能力真的无语了。
    • 我注意到一个不受欢迎的行为:在 Excel VBA 编辑器中编辑代码时,插入了一些“击键”。如果我暂停 AutoHotkey 一切都很好。有什么可以修复的吗?
    • Excel 中也发生了奇怪的行为:我得到了 ctrl (numpad); ctrl(小键盘); ctrl(小键盘)写在一个单元格中。
    • 我想在使用 shell 消息时遇到这样的意外应该不会太令人惊讶。我无法重现该问题,但我在代码中添加了一项检查。看看现在能不能用。它现在检查 shell 消息是否与活动窗口相关。
    • 0x464e,它现在似乎工作得很好。不再干扰其他程序!谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多