Button Problem

02/19/2010 22:25 Σternαl.#1
Hey Comunity,

ich hab da ein Problem. Hab auch schon SuFu & Google benutzt + Scripts
angeguckt, aber anscheinend hat niemand das selbe Problem wie ich.

Und zwar hab ich mir nen simplen Bot gemacht, der mich in Guild Wars anmelden
soll und dann nen Charakter auswählen soll. Klappt auch alles soweit gut^^
Aber ich hab jetzt noch 2 Buttons eingebaut; Start und Stopp.
Start = GW in den Vordergrund, W gedrückt halten, 10 secs halten
und dann den Bot in den Vordergrund.
Stopp = GW in den Vordergrund und W loslassen.

Hab auch noch den "Schließen" Button mit den Anweisungen Exit, ExitLoop und GUIDelete()
belegt, und das funktioniert auch, sofern das Programm seine Befehle abgearbeitet hat.

Aber der Start und der Stopp Button wollen ums Verecken nicht funktionieren.
Habs schon mit Select-Case, Switch-Case und aus lauter Verzweiflung mit If-Then
versucht, alles hat nicht geklappt... Hier mal die 3 Codes, was mach ich falsch?

If Then

Switch Case

Select Case

Dazu muss ich noch sagen, dass ich absoluter AutoIt Anfänger bin.
Wenn ich etwas falsch gemacht hab (auch wenns fatal ist) bitte nicht anflamen.
Vllt brauch ich ja noch nen Header oder whatever, keine Ahnung :D
Achja, hab auch schon direkt die Befehle hinter zb Case geschrieben, also
ohne Funktion, hat aber auch nicht funktioniert.

Hoffe, ihr könnt mir helfen und bitte nett sein^^
02/19/2010 22:58 HardCore.1337#2
Ich weiß nicht ob das mit deiner Frage zusammen hängt, aber:

1) Hwnd und hWnd sind das gleiche. Groß und kleinschreibung sind egal
2) dann versteh ich was nicht:

PHP Code:
Func start()
    
WinActivate($hWnd) ;Guild Wars in den Vordergrund
    ControlSend
($hWnd"""""{w down}") ;"w" gedrückt halten
    Sleep
(1000)
    
WinActivate($hwnd) ;Bot wieder in den Vordergrund
EndFunc

Func end
()
    
WinActivate($hWnd)
    
ControlSend($hWnd"""""{w up}") ;"w" loslassen
EndFunc 
In der Funktion "Start" drückst du W und lässt es gedrückt bis du die Funktion End aufrufst? Warum das?

4)
PHP Code:
Case $nMsg $GUI_EVENT_CLOSE
    
Exit
    
ExitLoop
    GUIDelete
($hwnd
Exit reicht

5) Wo rufst du die Funktionen auf o0? ich seh nix (nix gegen dich, vlt hab ichs einfach nicht endeckt ;))

Und generell, was soll der Bot überhaupt machen? Du schickst ihn in den Hintergrund, drückst lange W und holst ihn wieder in den Vordergrund
02/19/2010 23:30 Σternαl.#3
Also da ich ja in den Anfängen von AutoIt bin, ist das einfach nur ein Testbot :D
Ich will mich halt stückweise vorarbeiten, und den bot Stück für Stück erweitern.
Deswegen auch das mit den W drücken und der end Funktion, einfach um zu sehen obs klappt ^^
Und aus dem W drücken wird dann irgendwann mehr und mehr, bis es ein vollständiger Bot ist^^
Und wegen hwnd und hWnd: hwnd=Handle vom Bot und hWnd=Handle von Guild Wars.
Sieht man auch hier:
PHP Code:
$hWnd WinGetHandle("Guild Wars") ;Handle von Guild Wars holen 
$hwnd 
WinGetHandle("Guild Wars Bot") ;Handle vom Bot holen 
Zu 5., Da ruf ich keine Funktion auf, weil das ja auch so klappt^^
Aber haste keine Idee, warum die Buttons nicht funktionieren?

€dit: Sry, dass die Antwort erst jetzt kommt, war noch duschen :D
02/20/2010 00:28 kknb#4
die handles bleiben doch gleich wenn es das selbe fenster ist, kapier ich grad nicht.

deine buttons werden nicht gehen da es kein winhandle für den fensternamen "guild wars bot" gibt. oder heisst dein gw client wirklich guild wars bot? meiner heisst nur Guild Wars.
02/20/2010 09:20 HardCore.1337#5
Hab ich auch erst nicht, aber schau mal:

$Hwnd = WingetProcess ("Guild Wars")
und $hWnd = WinGetProcess ("Guild Wars Bot")

Das heißt, er holt sich das Handle von seinem eigenen Programm.

und $Hwnd = $hWnd.
Groß und kleinschreibung wird nicht beachtet.

Aber trotz allen müssten die Buttons eigentlich gehen
02/20/2010 10:14 | Moep |#6
Tja, da default "Opt("WinTitleMatchMode", 1)" gesetzt ist funktioniert beides.
es würde genauso "$hWnd = WinGetHandle("Guild Wars dsfghsbf j")" funktionieren...
02/20/2010 10:36 HardCore.1337#7
ja aber die variable würde doch dann ersetzt werden, weil hWnd und Hwnd gleich sind.
Oder irre ich mich da
02/20/2010 10:40 | Moep |#8
ja stimmt auch, da groß und kleinschreibung bei autoit keine relevanz hat besitz die variable den letzen zugewiesenen wert.
02/20/2010 11:12 Σternαl.#9
Oh man geil =D
Jetzt klappts endlich, hab einfach hwnd & hwnd2 gemacht :D
Bin das von C++ gewöhnt, dass man auf Groß- und Kleinschreibung achten muss^^
Vielen Dank!

Und btw, ja ich hab mir den Handle von meinem Bot geholt,
damit ich den mit WinActivate in den Vordergrund holen kann^^
Und bei mir heißt das Gw Fenster auch Guild Wars =D
Warum sollte mein Gw Fenster Guild Wars Bot heißen? xD

Naja egal auch, es klappt^^
Thx nochmal :D

Aber jetzt kommt grad noch ein Problem, und zwar hab ich nen Bot gemacht, der
auf Knopfdruck GW maximieren soll und dann abwechselnd /sit und /stand spammen soll.
Also wenn ich es ohne Switch-Case direkt in den Loop (oder wie heißt das?^^) mache,
klappt es auch prima, aber wenn ich es mit Switch-Case oder auch mit ner If schleife mache,
maximiert der Bot GW, spammt ungefähr 5 mal /sit & /stand in den Chat, aber nach den paar
mal hört das Programm aufeinmal auf, es drückt auch keine Inventar-Taste oder was auch
immer, also ein Enter hab ich nicht vergessen. Ich hab mir jetzt gedacht, dass es vllt daran
liegt, dass es bei Schleifenbeginn immerwieder WinAvtivate($hwnd) macht, und deswegen
gibts irgend ne Störung im Programm oder ka was, aber das kann ja nicht sein, sonst hätte
es ja schon nach 1 mal Spam, also einem Schleifendurchlauf geendet.

€dit: Habs jetzt mal mit ner func gemacht, jetzt durchläufts wirklich nurnoch 1 mal
die Schleife als es kommt nur einmal /sit & /stand an.....

Wisst ihr, wo das Problem liegt?
Ich hab echt keine Idee oO
02/20/2010 11:19 HardCore.1337#10
Kleiner Tipp. Nutz
PHP Code:
WinSetState ("GuildWars""", @SW_SHOW
und
PHP Code:
WinSetState ("Guild Wars""", @SW_HIDE
also:

PHP Code:
Global $i
Global $Anzahl InputBox("Frage""Wie oft soll gespammt werden?")

Func Start ()
WinSetState("Guild Wars""", @SW_SHOW)
For 
$i 1 to $Anzahl
  ControlSend 
("Guild Wars""""""{ShiftDown}")
  
ControlSend ("Guild Wars""""""7")
  
ControlSend ("Guild Wars""""""{ShiftUp}")
  
ControlSend ("Guild Wars""""""sit")
  ...
Next 
02/20/2010 11:25 Σternαl.#11
Ok, ich versuchs mal^^
Aber was macht WinSetState denn?
Erst show und dann hide? oO
02/20/2010 11:27 HardCore.1337#12
Show holt das Fenster in den Vordergrund
Hide versteckt es^^
02/20/2010 11:43 Σternαl.#13
Also, ich hab jetzt mal ein bisschen umgeändert, das Prinzip ist aber das selbe.
Aber egal, welche Anzahl ich eingebe, es durchläuft die Schleife immer nur 4 mal.

PHP Code:
#include <GUIConstantsEx.au3>

GUICreate("Guild Wars Bot"335100)
$hello GUICtrlCreateButton("Los!"1008)
Global 
$input GUICtrlCreateInput(""508)
GUISetState(@SW_SHOW)

Opt("SendKeyDownDelay"40)
Opt("SendKeyDelay"40)

$hwnd WinGetHandle("Guild Wars")

Global 
$i

Func hellofunc
()
    
WinSetState("Guild Wars""", @SW_MAXIMIZE)
    For 
$i 1 to $input
        ControlSend
($hwnd""0"{enter}")
        
sleep(30)
        
ControlSend($hwnd""0"{shiftdown}7{shiftup}sit")
        
sleep(30)
        
ControlSend($hwnd""0"{enter}")
        
sleep(30)
        
ControlSend($hwnd""0"{enter}")
        
sleep(30)
        
ControlSend($hwnd""0"{shiftdown}7{shiftup}stand")
        
sleep(30)
        
ControlSend($hwnd""0"{enter}")
        
sleep(30)
    
Next
EndFunc

While 1
    $msg 
GUIGetMsg()
    
    Switch 
$msg 
    
Case $hello
    hellofunc
()
    EndSwitch
WEnd 
Habs in @SW_MAXIMIZE umgeändert, weil @SW_SHOW bei mir nicht funktioniert^^
02/20/2010 12:20 HardCore.1337#14
probier mal
Global $Input = Inputbox()
02/20/2010 13:04 Σternαl.#15
Cool, jetzt klappts^^
Aber warum klappte das nicht mit GUICtrlCreateInput?
Naja, egal^^
Vielen dank nochmal^^