本文介绍了自动热键-将热键发送到嵌套文件夹的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
使用自动热键,我可以将";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
,因为它是推荐的更快、更可靠的发送模式。
这篇关于自动热键-将热键发送到嵌套文件夹的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!