我的计划是创建一个 Autohotkey 宏,将 Notepad++ 中当前打开的文件保存到我的桌面上。我能够让它打开“另存为”标准对话框,但我不知道如何让它转到桌面(Windows 7)。我知道可以在其中选择文件夹的组合框的 ClassNN,但当我发送“D”表示桌面按键时,它会进入我的一个分区而不是我的桌面。
一个技巧是向包含主目录的组合框发送一次点击,然后发送“向上箭头”50次,然后发送“d”,然后发送{enter},但我认为这不是很优雅或稳定。
这是我当前的代码:
#IfWinActive, ahk_class Notepad++
!F11::
Send ^s
WinWaitActive, Save As
;ControlSend, ComboBox1, {Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up}{Up} d, Save As
ControlSend, Edit1, `%USERPROFILE`%\Desktop\%A_Hour% %A_Min% %A_Sec%, Save As
;ControlSend, Button2, {Space}, Save As
Return
#IfWinActive
以下是随机时间仍受 SHIFT 污染的样本实现:
%USERPROFILE%|DEsktop\02 27 40
5USERPROFILE%\desktop\02 30 25
答案1
为什么不直接给它文件名:%USERPROFILE%\Desktop\abc.txt
代码:
MyFileName=abc
Send, `%USERPROFILE`%\Desktop\%MyFileName%`.txt
您必须转义 % 符号和点。
您不是唯一遇到此问题的人。我也能复制此问题,而且各种论坛上都有几个关于 ControlSend 随机移位的问题,但没有可靠的答案。
避免这种情况的一种方法是使用 ControlFocus。它不如 ControlSend 好,因为你可能会失去焦点,但至少更可靠。
发送字符串很慢,因此您可以将字符串存储在剪贴板中并发送 ^v 来加快速度。
#IfWinActive, ahk_class Notepad
!F11::
Send ^s
WinWaitActive, Save As
MyFileName=`%USERPROFILE`%\Desktop\%A_Hour% %A_Min% %A_Sec%
ControlFocus, Edit1
Send, %MyFileName%
;ControlSend, Button2, {Space}, Save As
Return
#IfWinActive
好的,希望这是最后一个建议!这个建议在我的机器上运行完美!
#IfWinActive, ahk_class Notepad
!F11::
Send ^s
WinWaitActive, Save As
ControlSetText, Edit1, `%USERPROFILE`%\Desktop\%A_Hour% %A_Min% %A_Sec%, Save As
Return
#IfWinActive
答案2
- 我编写了一个 AutoHotkey 脚本,并根据您的目的进行了调整。它循环遍历工具栏按钮并触发桌面按钮。它设置控制文本并应用全选。
- 如果您按下 F11,它还会按下桌面按钮,当您已经另存为提示,并更新时间戳。可以通过注释掉“F11:: ;notepad++ (save as)”行来删除此附加功能。
- 该脚本可以适用于其他标准 Windows 另存为提示,旧样式如 Notepad++,以及新样式如记事本(Windows 7)。
- 注意:您需要将 Acc.ahk 文件放在 AutoHotkey\Lib 文件夹中。 https://github.com/Drugoy/Autohotkey-scripts-.ahk/blob/master/Libraries/Acc.ahk
[在屏幕右侧右键单击“Raw”,将目标另存为...] - 在 Notepad++ 7.2.2.0(Windows 7 64 位)上测试。
-
;note: requires Acc.ahk library in AutoHotkey\Lib folder
;https://github.com/Drugoy/Autohotkey-scripts-.ahk/blob/master/Libraries/Acc.ahk
;on right of screen right-click Raw, Save target as...
#IfWinActive, ahk_class Notepad++
F11:: ;notepad++ - save, click Desktop button + set text
Send ^s
WinWaitActive, Save As
#IfWinActive, Save As ahk_class #32770 ahk_exe notepad++.exe
F11:: ;notepad++ - click Desktop button + set text
WinGet, hWnd, ID, A
WinGetClass, vWinClass, ahk_id %hWnd%
WinGet, vPName, ProcessName, ahk_id %hWnd%
if !(vWinClass = "#32770") OR !(vPName = "notepad++.exe")
Return
hCtl := ""
if !hCtl ;check for treeview e.g. Notepad Win 7
{
ControlGet, hCtl, Hwnd, , SysTreeView321, ahk_id %hWnd%
if hCtl
oAcc := Acc_Get("Object", "outline", 0, "ahk_id " hCtl)
}
if !hCtl ;check for toolbar e.g. Notepad Win XP
{
ControlGet, hCtl, Hwnd, , ToolbarWindow322, ahk_id %hWnd%
if hCtl
oAcc := Acc_Get("Object", "tool_bar", 0, "ahk_id " hCtl)
}
Loop, % oAcc.accChildCount
if (oAcc.accName(A_Index) = "Desktop")
if (1, oAcc.accDoDefaultAction(A_Index))
break
FormatTime, vDate, , HH mm ss
ControlSetText, Edit1, %vDate%, ahk_id %hWnd%
PostMessage, 0xB1, 0, -1, Edit1, ahk_id %hWnd% ;EM_SETSEL
Return
#IfWinActive