1

Я планирую создать макрос 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

2 ответа2

1

Почему бы просто не дать ему имя файла:% USERPROFILE%\Desktop\abc.txt

КОД:

MyFileName=abc
Send, `%USERPROFILE`%\Desktop\%MyFileName%`.txt

Вы должны избежать знаков% и точки.

Вы не единственный с этой проблемой. Я могу повторить это, и есть несколько вопросов, и нет надежных ответов на случайные сдвиги в ControlSend на различных форумах.

Один из способов обойти это - использовать ControlFocus. Не так хорошо, как ControlSend, потому что вы можете потерять фокус, но, по крайней мере, более надежно.

Отправка строки выполняется медленно, поэтому вы можете сохранить ее в ClipBoard и отправить ^ 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
0
  • Я написал скрипт AutoHotkey, который я адаптировал для ваших целей. Он проходит по кнопкам панели инструментов и запускает рабочий стол. Он устанавливает контрольный текст и применяет выбор всех.
  • Он также будет нажимать кнопку «Рабочий стол», если вы нажмете клавишу F11, когда уже находитесь в приглашении «Сохранить как», и обновите отметку времени. Эту дополнительную функциональность можно удалить, закомментировав строку «F11::; notepad++ (сохранить как)».
  • Сценарий может быть адаптирован для работы с другими стандартными приглашениями Windows Save As, старым стилем, как в Notepad++, и новыми, как в Notepad (Windows 7).
  • Примечание: вам нужно поместить файл Acc.ahk в вашу папку AutoHotkey\Lib. https://github.com/Drugoy/Autohotkey-scripts-.ahk/blob/master/Libraries/Acc.ahk
    [в правой части экрана щелкните правой кнопкой мыши Raw, Save target as ...]
  • Протестировано на Notepad++ 7.2.2.0 (Windows 7 64-bit).

-

;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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .