Ждать горячей клавиши?

Мне интересно, почему мой скрипт не ждет, пока я отправлю горячую клавишу Alt + Shift + q?

WinWaitActive("Open")
HotKeySet("+!q", "ClickFill")
Func ClickFill()
    ControlClick("Open", "", "[CLASS:32770]")
    ControlSend("Open", "", "[CLASS:32770]", "C:\au3")
    Exit

Сценарий просто завершает работу после того, как диалоговое окно «Открыть» становится активным. Я пытаюсь заставить скрипт щелкнуть класс 32770, который является адресной строкой, а затем отправить ему каталог au3, который является моим каталогом скриптов autoit. Я надеюсь, что скрипт всегда будет оставаться открытым, поэтому каждый раз, когда я пытаюсь что-то открыть, он работает.

Вторая попытка

WinWaitActive("Open")
HotKeySet("+!q", "ClickFill")

While(1)
    Sleep(1000)
WEnd

Func ClickFill()
    ControlClick("Open", "", "[CLASS:32770]")
    ControlSend("Open", "", "[CLASS:32770]", "C:\au3")
    Exit

Скрипт остается открытым, но горячая клавиша не действует.


person Wolfpack'08    schedule 27.11.2015    source источник


Ответы (1)


Похоже, вам просто нужно закрыть свою функцию с помощью «EndFunc». Это работает для меня.

WinWaitActive("Open")
HotKeySet("+!q", "ClickFill")

While(1)
    Sleep(1000)
WEnd

Func ClickFill()
    MsgBox(262144,"","Look I work!")

    ControlClick("Open", "", "[CLASS:32770]")
    ControlSend("Open", "", "[CLASS:32770]", "C:\au3")
    Exit
EndFunc

Вот некоторый рабочий код для Notepad++

Global $g_hWinHandle, $g_hOpenWin

;set hotkey
HotKeySet("+!q", "ClickFill")

;open notepad++
ShellExecute(@ProgramFilesDir & "\notepad++\notepad++.exe")

;wait for notepad++ window
WinWait("[Class:Notepad++]")
If @error Then Exit

;get notepad++ window handle
$g_hWinHandle = WinGetHandle("[Class:Notepad++]")

;make sure the window is active
WinActivate($g_hWinHandle)
WinWaitActive($g_hWinHandle)

;open "Open" dialog
WinMenuSelectItem($g_hWinHandle, "", "&File", "&Open...")

;wait for "Open" dialog window
WinWaitActive("Open")

;get the "Open" dialog window handle
$g_hOpenWin = WinGetHandle("Open")
If @error Then Exit

;wait for hotkey
While (1)
    Sleep(1000)
WEnd

Func ClickFill()
    ;make sure the window is active
    WinActivate($g_hOpenWin)
    WinWaitActive($g_hOpenWin)

    ;focus the toolbar
    ControlFocus($g_hOpenWin, "", "[CLASS:ToolbarWindow32; INSTANCE:3]")
    ControlCommand($g_hOpenWin, "", "[CLASS:ToolbarWindow32; INSTANCE:3]", "SendCommandID", "1280")

    ;send our command to the toolbar
    ControlSetText($g_hOpenWin, "", "Edit2", "C:\au3")
    ControlSend($g_hOpenWin, "", "Edit2", "{ENTER}")

    Exit
EndFunc   ;==>ClickFill

В приведенном выше примере вы увидите, что я использую ControlFocus и ControlCommand для элемента управления ToolbarWindow32. Большинство диалоговых окон имеют элемент управления ToolbarWindow32. Чтобы имитировать нажатие на них, вы должны использовать ControlCommand с опцией SendCommandID. Вы можете получить этот идентификатор на вкладке панели инструментов в информационном инструменте AutoIt. Однако вы увидите, что после щелчка по элементу управления ToolbarWindow32 фокус переходит на элемент управления редактирования. Этот элемент управления редактированием — это то, на что вам нужно отправить текст, если вы хотите изменить каталоги. Найти этот элемент управления с помощью инструмента AutoIt может быть немного сложно. Вам нужно будет убедиться, что в параметрах не установлен флажок «Заморозить».

введите здесь описание изображения

Если у вас все еще есть проблемы с кодом, я бы порекомендовал вам сначала убедиться, что вы можете заставить код работать без горячей клавиши. Затем попробуйте это с помощью горячей клавиши с одной буквой, а затем, наконец, попробуйте с вашей комбинацией из нескольких горячих клавиш. Не имея доступа к вашему компьютеру, я просто предполагаю, но подозреваю, что вы неправильно обращаетесь к адресной строке. На вашем компьютере также может быть запущена программа, использующая ту же горячую клавишу.

person MrAutoIt    schedule 27.11.2015
comment
Да, когда диалоговое окно «Открыть» открыто в Notepad ++, горячая клавиша по-прежнему ничего не делает, а затем сценарий просто завершается. - person Wolfpack'08; 28.11.2015
comment
Кажется, вообще не работает... Горячая клавиша не меняет того, что находится в классе edit2. Я использую notepad++ в качестве примера программы. Конечная цель состоит в том, чтобы сделать это для всех всплывающих «открытых» диалогов. Но даже возможность сделать это для блокнота было бы неплохо. Просто возможность определить, на что нужно нацелиться, чтобы мне не приходилось использовать ненадежные щелчки мыши, является целью вопроса, понимаете? Использование щелчков мыши для активации адресной строки ненадежно, потому что иногда люди перемещают окно, а окно постоянно перемещается, поэтому скрипт на некоторое время прерывается. - person Wolfpack'08; 28.11.2015
comment
Что происходит, однако: всплывает диалог открытия, но нажатие alt-shift-q не заполняет адресную строку. Так что я не должен говорить «совсем не работает». - person Wolfpack'08; 28.11.2015
comment
Я добавил еще несколько пояснений к сообщению, которые должны помочь. - person MrAutoIt; 29.11.2015
comment
Почему вы называете свои переменные g_, если вы также не используете локальные переменные? Вероятно, это просто сбивает с толку кого-то с проблемами новичка... ;-) - person Samoth; 30.11.2015
comment
Когда я впервые начал программировать, у меня было много проблем с моими программами, потому что я не понимал важности области видимости переменных. В основном это было из-за того, что люди давали мне небрежные примеры. В конце концов я понял, что делал неправильно, и мне пришлось вернуться и исправить свои плохие привычки кодирования. Я мог бы избавить себя от многих проблем, если бы с самого начала просто использовал рекомендуемые передовые методы кодирования. Вот почему я стараюсь использовать правильные имена переменных в своих примерах (даже простых). См. также: Лучшие методы кодирования - person MrAutoIt; 30.11.2015