Code mit GUI verbinden!

08/29/2012 07:02 Kutzlor#1
Hallo!

Ich kenne mich mit Autoit soweit aus wie ich es bis jetzt immer gebraucht habe, dennoch habe ich es nie für notwendig gefunden eine GUI dazuzu geben.


Jetzt will ich aber einfach mal zum ausprobieren einen Buffbot für ein MMO machen.

Z.b. soll man aus einem Dropdownmenü F1 bis F8 auswählen können und dann nebenbei von 1Sec bis 100Sec

Code:
#include <Misc.au3>
HotKeySet("{F9}", "_pause")
While 1
    ControlSend("Title", "VARIBLE?")
    Sleep(VARIABLE?) 
WEnd

Func _pause()
    Do
        Sleep(100)
    Until _IsPressed("79")
EndFunc
Wie mach ich denn jetzt wirklich Variablen und wie kann ich die über die GUI eingeben lassen?

MFG
08/29/2012 08:57 Crack-wtf#2
Benutz Koda um deine Gui zu machen.
Dann erstellst du dir den Code, welcher alle für die GUI wichtigen includes mitbringt.
Den Code packste in dein Script, und arbeitest mit den mitgegebenen Variablen :O

Variablen sind Halter von Informationen.
Beispiel: $Test = 190

Danach kannste mit der Variable $Test arbeiten falls du das nich ganz verstanden hast.



PHP Code:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Global $BotOn 0

#Region ### START Koda GUI section ### Form=
$Form1 GUICreate("Buffbot"24281924334)
$Label1 GUICtrlCreateLabel("Key:"16162517)
$Combo1 GUICtrlCreateCombo("F1"48135725BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$Combo GUICtrlSetData(-1,"F2|F3|F4|F5|F6|F7|F8")
$Button1 GUICtrlCreateButton("Start"84810725)
$Button2 GUICtrlCreateButton("Stop"1284810725)
GUICtrlSetState(-1$GUI_DISABLE)
$Label2 GUICtrlCreateLabel("Sleep (Sec.):"128166517)
$Input1 GUICtrlCreateInput("1"192134121)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit
        Case 
$Button1
            GUICtrlSetState
($Combo1$GUI_DISABLE)
            
GUICtrlSetState($Input1$GUI_DISABLE)
            
GUICtrlSetState($Button1$GUI_DISABLE)
            
GUICtrlSetState($Button2$GUI_ENABLE)
            
Start(GUICtrlRead($Input1))

    EndSwitch
WEnd

Func Start
($Sleep)
    
$BotOn 1
    
While $BotOn
        
For $i 1 To $Sleep
            
For $i2 1 to 1000
                
Switch GuiGetMsg()
                    Case -
3
                        
Exit
                    Case 
$Button2
                        $BotOn 
0                
                        GUICtrlSetState
($Combo1$GUI_ENABLE)
                        
GUICtrlSetState($Input1$GUI_ENABLE)
                        
GUICtrlSetState($Button2$GUI_DISABLE)
                        
GUICtrlSetState($Button1$GUI_ENABLE)        
                EndSwitch
            
Next
            ControlSend
("Title"GUICtrlRead($Combo1))
        
Next
    WEnd
EndFunc 

Hier nen beispiel.
Muss jetzt los bb
08/29/2012 10:29 Kutzlor#3
Danke sehr! :D
08/29/2012 11:58 lolkop#4
nie mit mehr als einer endlosschleife arbeiten. wie man hier schön sieht führt das ganze zu sehr viel redundantem code.

da es sogar schon einen zustand des bots gibt, welcher nur nicht genutzt wird, kann man das ganze auch leicht zu etwas derartigem umschreiben:
Code:
Global $BotOn = False, $name[2] = ['Start','Stop'], $timer

GUICreate("Buffbot", 242, 81, 924, 334)
GUICtrlCreateLabel("Key:", 16, 16, 25, 17)
$Combo1 = GUICtrlCreateCombo("F1", 48, 13, 57, 25, 3)
GUICtrlSetData(-1,"F2|F3|F4|F5|F6|F7|F8")
$Button1 = GUICtrlCreateButton($name[$BotOn], 8, 48, 228, 25)
GUICtrlCreateLabel("Sleep (Sec.):", 128, 16, 65, 17)
$Input1 = GUICtrlCreateInput("1", 192, 13, 41, 21)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1
			$BotOn = Not $BotOn
			GUICtrlSetData($Button1, $name[$BotOn])
	EndSwitch
	If $BotOn And TimerDiff($timer)>=GUICtrlRead($Input1)*1000 Then
			ControlSend('Title', '', '', GUICtrlRead($Combo1))
			$timer = TimerInit()
	EndIf
WEnd
08/29/2012 12:25 Kutzlor#5
Ah, okay.

Nur noch ne Frage! Wie kann ich dem Programm sagen das es zu dem einem Fenster geht wenn der Bot schon läuft?
Es hat immer einen anderen Namen also z.B. TITELNAME - *irgendwas random*
Es geht ja nicht wie bei Linux das ich einfach einen "*" dran mache? :P
08/29/2012 12:34 Achat#6
Beispiel
Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 615, 438, 192, 124)
$InputTitel = GUICtrlCreateInput("Titelname hier eingeben", 32, 56, 369, 21)
$ButtonTitelnameSpeichern = GUICtrlCreateButton("ButtonTitelnameSpeichern", 32, 80, 153, 73)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Global $sTitelName

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $ButtonTitelnameSpeichern
			$sTitelName=GUICtrlRead($InputTitel)
			MsgBox(0,'Titelname',$sTitelName)
	EndSwitch
WEnd
MfG
08/29/2012 13:12 lolkop#7
Quote:
AutoIt operates in one of three "Window matching" modes. The modes are set with the AutoItSetOption function using the WinTitleMatchMode option.

Mode 1 (default)

Matches partial titles from the start.

In this mode the a window titled Untitled - Notepad would be matched by "Untitled - Notepad", "Untitled", "Un", etc.
wie du siehst braucht man, sofern nicht explizit geändert, keinen vollen titel angeben.

"Titel - abcde" würde auch von "Titel" erkannt werden.
08/29/2012 16:34 Crack-wtf#8
Quote:
Originally Posted by lolkop View Post
nie mit mehr als einer endlosschleife arbeiten. wie man hier schön sieht führt das ganze zu sehr viel redundantem code.

da es sogar schon einen zustand des bots gibt, welcher nur nicht genutzt wird, kann man das ganze auch leicht zu etwas derartigem umschreiben:
Code:
Global $BotOn = False, $name[2] = ['Start','Stop'], $timer

GUICreate("Buffbot", 242, 81, 924, 334)
GUICtrlCreateLabel("Key:", 16, 16, 25, 17)
$Combo1 = GUICtrlCreateCombo("F1", 48, 13, 57, 25, 3)
GUICtrlSetData(-1,"F2|F3|F4|F5|F6|F7|F8")
$Button1 = GUICtrlCreateButton($name[$BotOn], 8, 48, 228, 25)
GUICtrlCreateLabel("Sleep (Sec.):", 128, 16, 65, 17)
$Input1 = GUICtrlCreateInput("1", 192, 13, 41, 21)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button1
			$BotOn = Not $BotOn
			GUICtrlSetData($Button1, $name[$BotOn])
	EndSwitch
	If $BotOn And TimerDiff($timer)>=GUICtrlRead($Input1)*1000 Then
			ControlSend('Title', '', '', GUICtrlRead($Combo1))
			$timer = TimerInit()
	EndIf
WEnd
Schreibe halt gern eigene Funktionen :P
Finde es hässlich alles in die main schleife zu klatschen.

Edit: Will ja nich heulen aber ich krieg kein Thanks?
Obwohl ich mir so früh noch die zeit genommen hab dir nen Beispiel zu schreiben -.-
08/29/2012 17:17 Kutzlor#9
Quote:
Originally Posted by Crack-wtf View Post
Schreibe halt gern eigene Funktionen :P
Finde es hässlich alles in die main schleife zu klatschen.

Edit: Will ja nich heulen aber ich krieg kein Thanks?
Obwohl ich mir so früh noch die zeit genommen hab dir nen Beispiel zu schreiben -.-
Entschuldige übersehen!
<3 :* :D

______________________

Okay, ich habe das mal alles so hinbekommen das hier keine Fehlermeldung kommt :P

Aber dennoch sendet er nicht an das Programm! (Habs auch mal mit Notepadprobiert ob er da etwas schreibt!

Programm ist im Anhang! (Source natürlich)

Für die ungläubigen unter euch VT: [Only registered and activated users can see links. Click Here To Register...]

#Edit:
Code:
Global $BotOn = False, $name[2] = ['Start','Stop'], $timer

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region
$Form1 = GUICreate("Buffbot", 475, 205, 192, 124)
$Label1 = GUICtrlCreateLabel("Sleep (Sec.) :", 120, 16, 68, 17)
$Combo1 = GUICtrlCreateCombo("F1", 56, 16, 57, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1,"F2|F3|F4|F5|F6|F7|F8|1|2|3|4|5|6|7|8|9|")
$Label2 = GUICtrlCreateLabel("Key:", 24, 48, 25, 17)
$Combo2 = GUICtrlCreateCombo("F1", 56, 48, 57, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1,"F2|F3|F4|F5|F6|F7|F8|1|2|3|4|5|6|7|8|9|")
$Label3 = GUICtrlCreateLabel("Key:", 24, 80, 25, 17)
$Combo3 = GUICtrlCreateCombo("F1", 56, 80, 57, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlSetData(-1,"F2|F3|F4|F5|F6|F7|F8|1|2|3|4|5|6|7|8|9|")
$Input1 = GUICtrlCreateInput("", 192, 16, 105, 21)
$Input2 = GUICtrlCreateInput("", 192, 48, 105, 21)
$Input3 = GUICtrlCreateInput("", 192, 80, 105, 21)
$Label4 = GUICtrlCreateLabel("Key:", 24, 16, 25, 17)
$Label5 = GUICtrlCreateLabel("Sleep (Sec.) :", 120, 48, 68, 17)
$Label6 = GUICtrlCreateLabel("Sleep (Sec.) :", 120, 80, 68, 17)
$Fenstername = GUICtrlCreateInput("Fenstername", 24, 104, 300, 24)
GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype")
GUICtrlSetBkColor(-1, 0xD7E4F2)
$Button1 = GUICtrlCreateButton("Fenstername Speichern", 24, 128, 435, 65)
$Button2 = GUICtrlCreateButton("Start Buffbot", 304, 16, 153, 81)
GUISetState(@SW_SHOW)
#EndRegion

Global $sTitelName

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Button1
			$sTitelName=GUICtrlRead($Fenstername)
			MsgBox(0, 'Buffbot -' & $sTitelName , $sTitelName)
			$LabelNAME = GUICtrlCreateLabel($sTitelName, 330, 107, 100, 25)
	EndSwitch
WEnd

While 2
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Button2
			$BotOn = Not $BotOn
			GUICtrlSetData($Button2, $name[$BotOn])
	EndSwitch
	If $BotOn And TimerDiff($timer)>=GUICtrlRead($Input1)*1000 Then
			ControlSend($sTitelName, '', '', GUICtrlRead($Combo1))
			$timer = TimerInit()
		 EndIf
   	If $BotOn And TimerDiff($timer)>=GUICtrlRead($Input2)*1000 Then
			ControlSend($sTitelName, '', '', GUICtrlRead($Combo2))
			$timer = TimerInit()
		 EndIf
   	If $BotOn And TimerDiff($timer)>=GUICtrlRead($Input1)*1000 Then
			ControlSend($sTitelName, '', '', GUICtrlRead($Combo3))
			$timer = TimerInit()
	EndIf
WEnd


#Edit:
Wie kriege ich die Auswahl von der Choicebox zum ControlSend? -.- Sonst geht es ja nicht >_>
Oder wird das schon durch GUICtrlRead gemacht?
Ich kenn mich grad überhaupt nicht mehr aus, HELP PLS! ^^
08/29/2012 19:55 omer36#10
while 2 ist schonma ganz falsch...

und da du jetz 3 einträge senden willst, reicht 1 timer nicht aus.
und du solltest noch jeweils abfragen, ob im input eine zahl eingegeben wurde... z. b. so:
PHP Code:
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region
$Form1 GUICreate("Buffbot"475205192124)
$Label1 GUICtrlCreateLabel("Sleep (Sec.) :"120166817)
$Combo1 GUICtrlCreateCombo("F1"56165725BitOR($CBS_DROPDOWN$CBS_AUTOHSCROLL))
GUICtrlSetData(-1"F2|F3|F4|F5|F6|F7|F8|1|2|3|4|5|6|7|8|9|")
$Label2 GUICtrlCreateLabel("Key:"24482517)
$Combo2 GUICtrlCreateCombo("F1"56485725BitOR($CBS_DROPDOWN$CBS_AUTOHSCROLL))
GUICtrlSetData(-1"F2|F3|F4|F5|F6|F7|F8|1|2|3|4|5|6|7|8|9|")
$Label3 GUICtrlCreateLabel("Key:"24802517)
$Combo3 GUICtrlCreateCombo("F1"56805725BitOR($CBS_DROPDOWN$CBS_AUTOHSCROLL))
GUICtrlSetData(-1"F2|F3|F4|F5|F6|F7|F8|1|2|3|4|5|6|7|8|9|")
$Input1 GUICtrlCreateInput(""1921610521)
$Input2 GUICtrlCreateInput(""1924810521)
$Input3 GUICtrlCreateInput(""1928010521)
$Label4 GUICtrlCreateLabel("Key:"24162517)
$Label5 GUICtrlCreateLabel("Sleep (Sec.) :"120486817)
$Label6 GUICtrlCreateLabel("Sleep (Sec.) :"120806817)
$Fenstername GUICtrlCreateInput("Fenstername"2410430024)
GUICtrlSetFont(-184000"Palatino Linotype")
GUICtrlSetBkColor(-10xD7E4F2)
$Button1 GUICtrlCreateButton("Fenstername Speichern"2412843565)
$Button2 GUICtrlCreateButton("Start Buffbot"3041615381)
GUISetState(@SW_SHOW)
#endregion

Global $BotOn False$name[2] = ['Start''Stop'], $timer[3], $sTitelName

While 1
    $nMsg 
GUIGetMsg()
    Switch 
$nMsg
        
Case $GUI_EVENT_CLOSE
            
Exit

        Case 
$Button1
            $sTitelName 
GUICtrlRead($Fenstername)
            
MsgBox(0'Buffbot -' $sTitelName$sTitelName)
            
$LabelNAME GUICtrlCreateLabel($sTitelName33010710025)

        Case 
$Button2
            $BotOn 
Not $BotOn
            GUICtrlSetData
($Button2$name[$BotOn])

    EndSwitch

    If 
GUICtrlRead($Input1) <> "" Then
        
If $BotOn And TimerDiff($timer[0]) >= GUICtrlRead($Input1) * 1000 Then
            ControlSend
($sTitelName''''GUICtrlRead($Combo1))
            
$timer[0] = TimerInit()
        EndIf
    EndIf
    If 
GUICtrlRead($Input2) <> "" Then
        
If $BotOn And TimerDiff($timer[1]) >= GUICtrlRead($Input2) * 1000 Then
            ControlSend
($sTitelName''''GUICtrlRead($Combo2))
            
$timer[1] = TimerInit()
        EndIf
    EndIf
    If 
GUICtrlRead($Input3) <> "" Then
        
If $BotOn And TimerDiff($timer[2]) >= GUICtrlRead($Input3) * 1000 Then
            ControlSend
($sTitelName''''GUICtrlRead($Combo3))
            
$timer[2] = TimerInit()
        EndIf
    EndIf
WEnd 
08/29/2012 20:34 -STORM-#11
Für die Controls würde sich ein Array anbieten. Damit könnte man einfach alle in einer For Schleife abarbeiten.

Kannst dir ja mal das als Beispiel nehmen. Macht im Prinzip dasselbe, nur mit ein bisschen mehr Möglichkeiten.
[Only registered and activated users can see links. Click Here To Register...]
08/29/2012 21:32 lolkop#12
Quote:
Originally Posted by omer36 View Post
while 2 ist schonma ganz falsch...

und da du jetz 3 einträge senden willst, reicht 1 timer nicht aus.
und du solltest noch jeweils abfragen, ob im input eine zahl eingegeben wurde...
das ist soweit schonmal richtig.

wollen wir das ganze wie in deinem codebeispiel nutzen, so reicht es natürlich aus die $BotOn checks einmalig auszuführen, und nicht in jedem "teil send" einzeln.

da wir hier 3 recht identische codestellen haben, können wir das ganze auch schön mithilfe von arrays zu einem codeblock zusammen fassen.

davon abgesehen, ist es unlogisch einen fenstertitel festzusetzen. hier kann man viel schöner dynamisch mit dem user arbeiten, indem immer der aktuelle fenstertitel genommen wird (abgesehen davon ist die manuelle eingabe, die bei weitem schlechteste/unkomfortabelste variante für den user, ein fenster zu wählen).

etwas umgeschrieben erhält man so zb einen derartigen code:
Code:
Dim $BotOn = False, $name[2] = ['Start', 'Stop'], $array[3][3]

GUICreate("Buffbot", 320, 150, 192, 124)
For $i=0 To 2
	GUICtrlCreateLabel('Sleep (Sec.) :', 120, 16+$i*32, 68, 17)
	GUICtrlCreateLabel("Key:", 24,20+$i*32, 25, 17)
	$array[$i][1] = GUICtrlCreateInput('', 192, 16+$i*32, 105, 21)
	$array[$i][0] = GUICtrlCreateCombo('F1', 56, 16+$i*32, 57, 25, 3)
	GUICtrlSetData(-1, "F2|F3|F4|F5|F6|F7|F8|1|2|3|4|5|6|7|8|9|")
Next
$Fenstername = GUICtrlCreateInput("Fenstername", 24, 110, 200, 24)
GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype")
GUICtrlSetBkColor(-1, 0xD7E4F2)
$start = GUICtrlCreateButton("Start", 230, 109, 68, 25)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $start
            $BotOn = Not $BotOn
            GUICtrlSetData($start, $name[$BotOn])
	EndSwitch

	If $BotOn Then
		For $i=0 To 2
			If TimerDiff($array[$i][2]) >= GUICtrlRead($array[$i][1]) And WinExists(GUICtrlRead($Fenstername)) Then
				ControlSend(GUICtrlRead($Fenstername), '', '', GUICtrlRead($array[$i][0]))
				$array[$i][2] = TimerInit()
			EndIf
		Next
	EndIf
WEnd
08/30/2012 06:48 Kutzlor#13
Vielen herzlichen Dank an euch alle!

Ich glaube ich habe endlich eine weitere Section für mich entdeckt :3