在标准“另存为”对话框中设置目录

在标准“另存为”对话框中设置目录

我的计划是创建一个 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

相关内容