2017-05-24 8 views
1

Whileループといくつかの機能を含むAutoItスクリプトを一時停止したい。しかし、私はHotKeySet()でスクリプトを閉じることしかできません。どのように私はそれを一時停止することができますか?ループをホットキーで繰り返す

スクリプトは、画面の一部(x、y座標は設定ファイルに設定されています)の変更を確認し、警告音を鳴らした後にスクリーンショットを取得します。一時停止ボタンを押したときにループが終了することはありません。Whileしかし、プログラムを終了すると動作します。ここに私のコードは次のとおりです。

Global $Paused, $counter = 0 
HotKeySet("{1}", "TogglePause") 
HotKeySet("{2}", "Terminate") 
HotKeySet("{3}", "ShowMessage")  

Init() 
Start() 
While 1 
    $counter +=1 
    ToolTip('Script is "Running"',0,0, $counter, 1) 
    Sleep(700) 
     Switch TrayGetMsg() 
     Case $resume 
     Start() 
     DisableAlert() 
     Case $exit 
     ExitLoop 
     Exit 
    EndSwitch 
WEnd  

//some of the functions  
Func Start() 
    $ready = 0 
    $count = 0 
    $lastScreenshotNum = 0 
    TrayItemSetState($resume, $TRAY_DISABLE) 
    TraySetIcon("on.ico") 
    TakeScreenshot() 
    AdlibRegister(TakeScreenshot,2000) 
EndFunc  

Func Stop() 
    AdlibUnRegister(TakeScreenshot) 
    TraySetIcon("off.ico") 
    TrayItemSetState($resume, $TRAY_ENABLE) 
EndFunc 

Func TogglePause() 
    Stop() 
    $Paused = NOT $Paused 
    While $Paused 
     sleep(100) 
     ToolTip('Script is "Paused"',0,0, $counter, 1) 
    WEnd 
    ToolTip("") 
EndFunc 

Func Terminate() 
    Exit 0 
EndFunc 

Func ShowMessage() 
    MsgBox(4096,"","This is a message.") 
EndFunc 

Func EnableAlert() 
    SendMail() 
    Alert() 
    AdlibRegister(Alert,5000) 
EndFunc 

Func DisableAlert() 
    AdlibUnRegister(Alert) 
EndFunc 

Func Alert() 
    SoundPlay("alert.mp3") 
EndFunc 
+1

あなたTogglePause機能は、スクリーンショットを一時停止していますが、背面のトグル欠場。 NOT $を一時停止し、TogglePauseの最後にStart()を追加します。できます。 – Milos

答えて

1

私はwhile1ループといくつかの機能を含む、のAutoItスクリプトを一時停止します。しかし、私はHotKeySetのスクリプトを閉じることしかできません。だから私はそれを一時停止することができますか?

(キー切り替え)状態(未テスト、エラーなしチェック)に条件付きその指示を実行してWhile -loopsを "一時停止":

Global Const $g_sKeyQuit = 'q' 
Global Const $g_sKeyPause = 'p' 
Global Const $g_iDelay  = 500 

Global  $g_bStateQuit = False 
Global  $g_bStatePause = False 

Main() 

Func Main() 

    HotKeySet($g_sKeyQuit, 'SwitchStateQuit') 
    HotKeySet($g_sKeyPause, 'SwitchStatePause') 

    While Not $g_bStateQuit 

     If Not $g_bStatePause Then 

      YourCode() 

     EndIf 

     Sleep($g_iDelay) 

    WEnd 

    Exit 

EndFunc 

Func YourCode() 
    Local Static $iCount = 0 

    $iCount += 1 

    ConsoleWrite($iCount & @LF) 

EndFunc 

Func SwitchStateQuit() 

    $g_bStateQuit = True 

EndFunc 

Func SwitchStatePause() 

    _SwitchVar($g_sKeyPause) 

EndFunc 

Func _SwitchVar(ByRef $bSwitch) 

    $bSwitch = Not $bSwitch 

EndFunc 
  • Pポーズを。
  • 出口。
  • 必要に応じてYourCode()の内容を変更します。 (Main()While -loopを示す)

ビジュアル解説:

Conditional While-loop

  • ループとAdlibRegister()は(どちらか一方を選択してください)同じことを達成するためにさまざまな方法があります。単にSleep()を追加するタイムドリフトを導入するため、正確時限繰り返しが必要な場合
  • 使用TimerDiff()は(AdlibRegister()もについても同様である実行時間を無視します)。 documentation

    他の実行中のプロセスはタイミング精度に影響することが多く、一時停止は要求された時間よりわずかに長く続く可能性があることに注意してください。

関連する問題