Wie kann ich aus Schleife los werden ?

  • Hi,

    ich möchte mal ein kleines Tool schreiben. Es soll eine Ziffer-Taste alle z.B 3 Minuten auf Notepad (Neu.txt - Editor) tippen - auch wenn das Fenster Editor im Hintergrund läuft, und muss aufhören wenn die Taste Stop gedrückt wird.

    Leider arbeitet das Tool zu fleissig, obwohl ich mehrmals STOP gegrückt habe. Hilf mir bitte aus der Scheife los zu werden.
    Danke.

    Hier ist meine Skript :

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    ;------------------------------------------------GUI------------------------------------------------
    GUICreate("My GUI Automatic Tool",337,143)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Start_Button = GUICtrlCreateButton ("Start",285,28,50)
    Global $Stop_Button = GUICtrlCreateButton ( "Stop",285,58,50)
    Global $Quit_Button = GUICtrlCreateButton ( "Quit",285,88,50)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateTab(2,2,283,120)
    $Tab_Options = GUICtrlCreateTabItem("Options";)
    GUICtrlCreateLabel("Window's name",5,30)
    $n1 = GUICtrlCreateInput("Neu.txt - Editor",85,26,195)
    GUICtrlCreateLabel("Key",10,70)
    $n2 = GUICtrlCreateCombo("x",50,66,35)
    GUICtrlSetData(-1,"1|2|3|4|5|6|7|8|9|0","1";)
    $n3 = GUICtrlCreateCombo("1",85,66,35)
    GUICtrlSetData(-1,"2|3|4|5|6|7|8|9","9";)
    GUICtrlCreateLabel("Sekunden",120,68)
    $Tab_Help = GUICtrlCreateTabItem("Help";)
    GUISetState ()
    ;----------------------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $Window_Name = GUICtrlRead($n1)
    $Key = GUICtrlRead($n2)
    $Time = GUICtrlRead($n3)
    $msg = GUIGetMsg()
    If $msg = $Quit_Button Or $msg = $GUI_EVENT_CLOSE Then ExitLoop
    If $msg = $Start_Button Then
    Do
    ControlSend($Window_Name,"","Edit1", $Key)
    Sleep($Time*1000)
    Until $msg = $Stop_Button
    EndIf
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von upnl (20. November 2007 um 13:43)

  • Danke pee,
    och habe meine Skript umgeschrieben und kann weiterhin nicht aus der Schleife raus. Einmal wird Start_Button gedrückt, dann bleibt das Tool in der Scheife hängen.

    Ausserdem mit der Stop_Button wird es nicht aufhören zu tippen, sondern macht nur eine Pause, bis ich auf OK klicke. Gehe ich auf den falschen Weg ? Oder muss ich noch was hinzu ergänzen?

    Hier ist meine Skript. Kannst du mir bitte weiter helfen?
    MFG

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    ;----------------------GUI-----------------------
    Opt("GUIOnEventMode", 1) ; Wechsle ins OnEvent Modus

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("My GUI Automatic Tool",337,143) ; create a dialog box
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close_Or_Quit_Clicked")
    Dim $Start_Button = GUICtrlCreateButton ("Start",285,28,50)
    GUICtrlSetOnEvent($Start_Button, "Start_Clicked") ; Start_Button --> Event
    Dim $Stop_Button = GUICtrlCreateButton ( "Stop",285,58,50)
    GUICtrlSetOnEvent($Stop_Button, "Stop_Clicked") ; Stop_Button ---> Event
    Dim $Quit_Button = GUICtrlCreateButton ( "Quit",285,88,50)
    GUICtrlSetOnEvent($Quit_Button, "Close_Or_Quit_Clicked") ;Quit_Button or Close --> Event

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateTab(2,2,283,120)
    $Tab_Options = GUICtrlCreateTabItem("Options")
    GUICtrlCreateLabel("Window's name",5,30)
    $n1 = GUICtrlCreateInput("Neu.txt - Editor",85,26,195)
    GUICtrlCreateLabel("Key",10,70)
    $n2 = GUICtrlCreateCombo("x",50,66,35)
    GUICtrlSetData(-1,"1|2|3|4|5|6|7|8|9|0","1")
    $n3 = GUICtrlCreateCombo("1",85,66,35)
    GUICtrlSetData(-1,"2|3|4|5|6|7|8|9","2")
    GUICtrlCreateLabel("Sekunden",120,68)
    $Tab_Help = GUICtrlCreateTabItem("Help")
    GUISetState ()
    ;-----------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(1000)
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;-----------------Functions------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func Close_Or_Quit_Clicked()
    MsgBox(0, "GUI Event", "Quit")
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Stop_Clicked()
    MsgBox(0, "GUI Event", "Stop")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Start_Clicked()
    While 1
    $Window_Name = GUICtrlRead($n1)
    $Key = GUICtrlRead($n2)
    $Time = GUICtrlRead($n3)
    ControlSend($Window_Name,"","Edit1", $Key)
    Sleep($Time*1000)
    WEnd
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von upnl (20. November 2007 um 13:42)

  • wie oft soll die schleife wenn wiederholt werden? oder soll sie nach einen bestimmten event verlasen werden...? ;)

    • Offizieller Beitrag

    Hi!

    So scheint es mir zumindest wesentlich besser zu laufen:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    ;----------------------GUI-----------------------
    Opt("GUIOnEventMode", 1) ; Wechsle ins OnEvent Modus

    GUICreate("My GUI Automatic Tool",337,143) ; create a dialog box
    GUISetOnEvent($GUI_EVENT_CLOSE, "Close_Or_Quit_Clicked")
    Dim $Start_Button = GUICtrlCreateButton ("Start",285,28,50)
    GUICtrlSetOnEvent($Start_Button, "Start_Clicked") ; Start_Button --> Event
    Dim $Stop_Button = GUICtrlCreateButton ( "Stop",285,58,50)
    GUICtrlSetOnEvent($Stop_Button, "Stop_Clicked") ; Stop_Button ---> Event
    Dim $Quit_Button = GUICtrlCreateButton ( "Quit",285,88,50)
    GUICtrlSetOnEvent($Quit_Button, "Close_Or_Quit_Clicked") ;Quit_Button or Close --> Event


    GUICtrlCreateTab(2,2,283,120)
    $Tab_Options = GUICtrlCreateTabItem("Options")
    GUICtrlCreateLabel("Window's name",5,30)
    $n1 = GUICtrlCreateInput("Unbenannt - Editor",85,26,195)
    GUICtrlCreateLabel("Key",10,70)
    $n2 = GUICtrlCreateCombo("x",50,66,35)
    GUICtrlSetData(-1,"1|2|3|4|5|6|7|8|9|0","1")
    $n3 = GUICtrlCreateCombo("1",85,66,35)
    GUICtrlSetData(-1,"2|3|4|5|6|7|8|9","2")
    GUICtrlCreateLabel("Sekunden",120,68)
    $Tab_Help = GUICtrlCreateTabItem("Help")
    GUISetState ()
    ;-----------------------------------------------

    $on = False

    While 1
    if $on then
    ToolTip("on")
    $Window_Name = GUICtrlRead($n1)
    $Key = GUICtrlRead($n2)
    $Time = GUICtrlRead($n3)
    ControlSend($Window_Name,"","Edit1", $Key)
    Sleep($Time*1000)
    else
    ToolTip("off")
    sleep(100)
    EndIf
    WEnd



    ;-----------------Functions------------------

    Func Close_Or_Quit_Clicked()
    Exit
    EndFunc

    Func Stop_Clicked()
    $on = false
    EndFunc

    Func Start_Clicked()
    $on = true
    EndFunc

    [/autoit]

    peethebee

  • @Mignon :
    Die Schleife soll aufhören, wenn Stop_Button gedrückt wird.

    @ alle :
    Bei diesem Befehl

    [autoit]

    ControlSend($Window_Name,"","Edit1", $Key)

    [/autoit]


    wird auf Editor (Edit1) geschrieben.

    Was muss ich anstatt "Edit1" schreiben, wenn es auf cmd-Fenster (c:\Windows\system32\cmd.exe ist geöffnet) getippt werden soll ? Das Tool Autoit Windows Info liefert ausreichend Infomationen aus anderen Fenster, aber von cmd-Fenster liefert es keine ClassnameNN, Instance usw. Wie kann ich denn ClassnameNN oder ControlID von cmd-Fenster bekommen ?

    MFG

  • Danke pee ganz herzlich.. Es funktioniert !! :tongue:

    Eigentlich habe ich nichts mit cmd zu tun.
    Da ich mit einem Programm arbeite, wobei jeweils bestimmte Zeit eine Taste gedrückt werden muss (im Hintergrund); dann ist der Befehl ControlSend() besser geignet als Send(). Es wird jedoch nach ControlID verlangt, den ich mit Hilfe von Autoit Window Info nicht bekommen kann.

    Zuerst habe ich mit Editor probiert - sein ClassNN kann man sehr einfach haben: Edit1. Zufällig war Mauscursor auf cmd-Fenser, und ich habe gemerkt dass cmd wie mein Programm keine ClassNN usw. ablesen lässt.
    Daher will ich ja wissen wie ich ClassNN von solche Fenster wie cmd raus bekomme - oder anstatt ControlSend() anderer Befehl (welcher ?) verwenden soll.

    Hilfs du mir weiter ? ;)
    MFG

    • Offizieller Beitrag

    Das Kommandozeilenfenster ist ein besonderes. Wie auch Java-Programme (eigenes GUI-Rendering) und .Net-Programme verwendet es keine Standard-Controls von Windows. Auf diese ist AutoIt aber ausgelegt und kann daher diese drei Kategorien nicht so komfortabel fernsteuern wie den Rest. Was gehen könnte ich ControlSend mit "" statt "Edit1" oder so, aber das müsste man ausprobieren. Sonst evtl. SendKeepActive (neue Funktion, bitte aktuelle Beta installieren, Link auf der Startseite) versuchen.

    Viel Glück, Rückmeldung wäre schön,
    peethebee

  • Hi pee,

    SendKeppActive wäre gut. Ich habe die Betaversion auf meinem PC, konnte aber nicht Compile durchführen.

    ControlSend mit "" statt "Edit1" ist eine gute Lösung. Es funktioniert jedoch nur solang das Fenster aktiv ist. Wenn Das Fenster im Hintergrund liegt, findet keine Reaktion statt. Trotzdem dicke Lob ! Endlich läuft meine Software =)

    Danke nochmal an alle.
    MFG