本文介绍了自动热键-将热键发送到嵌套文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用自动热键,我可以将";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
此外,总体上摒弃了旧式语法。

然后切换到HSHELL_REDRAW事件以检查窗口标题是否更改。
计时的事情是过滤掉重复的外壳消息。当标题改变时,我们实际上一次就会收到大约10+条这样的消息。只需运行热键一次。
因此,简单的100毫秒降温就能奏效。
A_TickCount用于此。

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

最后,在发送热键之前,激活正确的控件,这样热键才能工作。如果您使用的是较旧或更高版本的Windows,则此部分可能不适合您。
也切换到SendInput,因为它是推荐的更快、更可靠的发送模式。

这篇关于自动热键-将热键发送到嵌套文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 08:32