Войти

Показать полную графическую версию : [решено] HotKeySet() для одновременного управления несколькими скриптами


Lyuk
25-08-2009, 11:37
Один скрипт запускает другой (или несколько), как сделать чтобы по горячей клавише все скрипты вставали на паузу. Пауза HotKeySet("{PAUSE}", "TogglePause") срабатывает только в первом скрипте, я так понимаю хоткей захватывается им, а в остальных работает только если назначить другую кнопку. Как сделать на одной кнопке ?

FlatX007
25-08-2009, 12:54
Ну проще всего принажатиии кнопки "паузы" внести данные в INI файл.
Другие скрипты будут считывать данные из этого INI файла. Считывать можно этим AdlibEnable

Lyuk
25-08-2009, 13:21
Вариант с INI файлом не совсем подходит, так как в момент нажатия паузы запущенные скрипты будут чего нибудь считать или ожидать или искать в цикле (которых много разных ) , и необходимо будет из всех циклов считывать этот INI файл что замедлит эти циклы (да и переписывать их надо будет). HotKeySet тем и хорош что позволяет вызвать функцию из любого места скрипта.

Medic84
25-08-2009, 14:18
Ты не понял. AdlibEnable работает сам по себе. Это замкнутый цикл, который вызывается каждые 100 мс (можно другое время задать) и собственно и служит для проверки чего либо. Мне кажется это хороший вариант...

FlatX007
25-08-2009, 14:33
Да да это хороший вариант.

Незабывем про кнопку ... ;)

Creat0R
25-08-2009, 17:05
Ну зачем же Ini, можно устроить интеракцию через GUI окно:

#include <GuiConstants.au3>

Global $iPaused = False

HotKeySet("{Pause}", "_TogglePause")

$hGUI = GUICreate("Test Script", 300, 200, 510)

$Button = GUICtrlCreateButton("Button", 20, 40, 60, 20)

GUISetState(@SW_SHOW, $hGUI)

_RunScript_Proc("Child Script")

While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd

Func _RunScript_Proc($sTitle)
$sScript = _
'#NoTrayIcon' & @CRLF & _
'#include <GuiConstants.au3>' & @CRLF & _
'Global $iPaused = False' & @CRLF & _
'' & @CRLF & _
'GUICreate("' & $sTitle & '", 300, 200, 200)' & @CRLF & _
'$nInteract_Edit = GUICtrlCreateEdit("", -100, -100, 50, 20)' & @CRLF & _
'' & @CRLF & _
'GUISetState(@SW_SHOW)' & @CRLF & _
'' & @CRLF & _
'While 1' & @CRLF & _
' Switch GUIGetMsg()' & @CRLF & _
' Case $GUI_EVENT_CLOSE' & @CRLF & _
' Exit' & @CRLF & _
' EndSwitch' & @CRLF & _
' ' & @CRLF & _
' If GUICtrlRead($nInteract_Edit) <> "" Then' & @CRLF & _
' GUICtrlSetData($nInteract_Edit, "")' & @CRLF & _
' _TogglePause()' & @CRLF & _
' EndIf' & @CRLF & _
'WEnd' & @CRLF & _
'' & @CRLF & _
'Func _TogglePause()' & @CRLF & _
' $iPaused = Not $iPaused' & @CRLF & _
' ' & @CRLF & _
' MsgBox(64, "", "_TogglePause from [' & $sTitle & '] script: " & $iPaused)' & @CRLF & _
' ' & @CRLF & _
' While $iPaused' & @CRLF & _
' Sleep(10)' & @CRLF & _
' If GUICtrlRead($nInteract_Edit) <> "" Then ExitLoop' & @CRLF & _
' WEnd' & @CRLF & _
'EndFunc' & @CRLF

$hFile = FileOpen(@TempDir & "\~Au3_Script.tmp", 2)
FileWrite($hFile, $sScript)
FileClose($hFile)

Run(@AutoItExe & ' /AutoIt3ExecuteScript "' & @TempDir & '\~Au3_Script.tmp"')
EndFunc

Func _TogglePause()
$iPaused = Not $iPaused

ControlSetText("Child Script", "", "Edit1", "_TogglePause")
Sleep(100)
MsgBox(64, "", "_TogglePause from [" & WinGetTitle($hGUI) & "] script: " & $iPaused)

While $iPaused
Sleep(10)
WEnd
EndFunc

Lyuk
25-08-2009, 17:17
Спасибо, работает, если бы AdlibEnable ещё бы неприостанавливал скрипт было бы вообще замечательно :) .

Eщё подскажите пожалуйста как вместо INI прикрутить События (Event), где на русском можно почитать про CreateEvent(), SetEvent() и их параметры или может быть пример приведёте.

Creat0R
25-08-2009, 17:23
А ещё как вариант, проверять в цикле других скриптов через _IsPressed() :)




© OSzone.net 2001-2012