ControlSend Problem

11/08/2010 21:22 lolkop#31
Quote:
Originally Posted by Belur View Post
Hey. Mal wider Richtung Topic etwas:

Hatte grad in der dt. Hilfe etwas zu ControlSend nachgelesen und bin auf diesen Ausschnitt gestoßen:

PHP Code:
$handle WinGetHandle
ControlSend
($handle""""" AbCdE"
Mir gehts eigentlich darum, dass in dem ControlSend Befehl als Title das $handle angeben wird.

Ist das also möglich anstatt den Titel des Fensters nur den Handle anzugeben.
Würd mir nen ganzen Schritt weiterhelfen. =)

Lg
also im 2ten post oder so hatte ich doch schon das hier geschrieben:
Quote:
Originally Posted by lolkop View Post
senden kannste mit controlsend.
einfach statt titel das handle in die funktion und text leer lassn.

das handle bekommste per wingethandle oder controlgethandle, bzw winlist, wenn du von allen clients die handles einlesen willst
11/09/2010 15:45 Belur#32
Hab das mal wider mit dem Notpad getestet.

Allerdings will der nicht so ganz. Hab als kleinen Test obs überhaupt klappt geschrieben:


PHP Code:
$handle WinGetHandle("Unbenannt - Editor")
Sleep(5000)
ControlSend($handle"","","!{F4}"
Nach meinem Verstädnis sollte sich eigentlich nach 5 Sekunden das Notepad schließen.
Allerdings schließt der immer das aktive Fenster.

Weiß jmd woran das liegt? Muss man das $handle irgendwo speichern, damit der an das Fenster mit dem jeweiligen handle sendet oder was ist falsch?
11/09/2010 15:57 maxi39#33
WinKill("[CLASS:Notepad] ", "")
11/09/2010 18:32 Belur#34
Quote:
Originally Posted by maxi39 View Post
WinKill("[CLASS:Notepad] ", "")

Kann man das $handle irgendwie einbinden um Befehle an Fenster zu senden?

Mir gings eig. darum, dass Handle von einem Fenster zu kriegen - okay, das ist jetzt eig kein Problem - um ein Fenster klar definiert zu haben.

Wenn es 2 Fenster gibt mit dem gleichen Namen kann ich nicht schreiben ControlSend("Name" ...) , da ich nicht will dass der Befehl an beide Fenster kommt.

Hätte ich jetzt das Handle von einem Fenster könnte man den Befehl ja über das Handle nur an das eine Fenster senden. - So zumindest meine Überlegung Habs an 2 Notepads getestet aber es ging ja nicht mit dem
ControlSend($handle ...)

Vllt weiß da jmd weiter.
11/09/2010 19:22 lolkop#35
guck dir dochmal in der autoit hilfe an, was alles als "titel" akzeptiert wird.

du kannst allgemein immer handles einsetzen, wenn nach titeln gefragt ist.
11/09/2010 19:29 Belur#36
Reicht es wenn man sich das Handle vorher über einen Befehl geholt hat, oder muss das in irgendeiner InputBox oder so gespeichert werden?
11/09/2010 19:33 lolkop#37
o0

wie geholt?
in autoit wird alles in vairbalen gespeichert. ob du das handle jetzt noch irgendwo ins gui schreibst, und dann per guictrlread einliest, oder direkt aus einer variablen nimmst ist eigentlich egal.
Code:
$wHnd = WinGetHandle(...)
bzw
$wHnd = ControlGetHandle
geben dir die handles zurück mit denen du arbeiten kannst.
11/09/2010 20:11 Belur#38
Habs mal mit dem Game direkt ausprobiert. Da klappts komischerweise. Ich weiss nicht warum beim Notepad nicht richtig ging. Spielt auch keine Rolle.

Weiss erstmal alles was ich zur Zeit brauche. Danke euch allen.
11/09/2010 20:15 lolkop#39
ein spiel würde ich immer über ProcessClose schließen =)
11/09/2010 20:37 Belur#40
Es ging nicht ums schließen an sich. hatte nur Alt + F4 zum senden genommen damit ich wirklich sehe, dass es gesendet wird.

Hat sich aber grad andres Problem ergeben.

Hab nen Script, dass hat so eine Ähnliche Struktur: Mal stark vereinfacht:

Case $Button1
While (...)
...

WEnd

Case $Button2

Soo: Mit dem Button möchte ich dir Schleife beenden die ich mit Button1 begonnen habe.
Weiß nicht genau wie ich das machen soll. Mit ExitLoop stellt sich mir die Frage welche Schleife er schließt wenn von mir aus 3 Schleifen aktiv sind.

Insgesamt 12 Buttons.
Jeweils 2 gehören zsm. Dh ich starte zB F3 die Schleife in der eine F Taste gespammt wird, und möchte sie mit F4 wider beenden ( Die Schleife)

Erstmal wär mir jede Lösung recht. Vllt gibts aber auch ne elegantere Lösung, dass ein Button Start und Stop ist. Nja. Weiss nicht genau wie ich das umsetzen kann.

Freue mich über jede Hilfe.
11/09/2010 20:59 lolkop#41
wenn du eine schleife am laufen hast...
Code:
While 1
    ;aktion x
WEnd
dann wird nur aktion x ausgeführt. dh wenn du einen code hast
Code:
While 1
    ;aktion y
    While 1
        ;aktion x
    WEnd
WEnd
Wirs nur EIN mal aktion y ausgeführt.
danach ist dein tool in aktion x "gefangen". es ist nicht möglich durch eine abfrage in aktion y aktion x zu beenden, da aktion y garnicht aktiv ist.

was ich damit sagen will ist, dass man nie mehr als eine endlosschleife verwenden sollte.

willst du zb in deiner schleife neben aktion y, noch manchmal aktion x ausführen, so kannst du das über zustands-variablen lösen.
bsp:
Code:
Dim $action_x = False
While 1
    ;aktion y
    if $action_x then ;aktion x
WEnd
;aktion y könnte jetzt zb deine GuiGetMsg() abfrage sein.

wird hier button1 gedrückt, so wird $action_x = True gesetzt. wird hingegen button2 gedrückt, so wird $action_x = False gesetzt.

auf diese art und weise kannst du per button steuern, ob aktion x ausgeführt wird, oder nicht, ohne dabei die GuiGetMsg() abfrage zu blockieren.
11/09/2010 21:08 Belur#42
Quote:
Originally Posted by lolkop View Post

Code:
While 1
    ;aktion y
    While 1
        ;aktion x
    WEnd
WEnd
Ich weiss nicht genau ob ich das so aufgebaut habe. Das sieht für mich nach einer Schleife in einer Schleife aus und ich weiß nicht obs bei mir so ist. Könnte durchaus sein:D

Hab mir das immer so vorgestellt:

Case $Button1
While 1
aktion_x

WEnd

Case $Button2

ExitLoop ( Die von Button 1 halt.) Wird i.wie anders vllt gehen.


Case §Button3
While1
aktion_y

WEnd

Case $Button4

ExitLoop(Diesmal halt die von 3.)

Und dann immer so weiter bis ich bei Button 12 bin.

Für jede Zeile halt 1 Start und Stop Button. Entspricht das deinem Modell, also dass das garnicht klappen kann oder ist das doch was anderes??

Lg
11/09/2010 21:49 lolkop#43
was glaubst du denn was:
Code:
While 1
    Switch GuiGetMsg()
        Case $button1
            While 1
                ;aktion1
            WEnd
        ....
    EndSwitch
WEnd
ist? das sind verschachtelte schleifen.
sobald du in eine der schleifen in der Hauptschleife gelangst, wird die Hauptschleife nicht mehr abgearbeitet.

genau deswegen musst du mit zusatndsvariablen arbeiten...

statt den schleifen in den button abfragen, setzt du einfach nurnoch vairbalen...
Code:
Dim $aktion1 = False
While 1
    Switch GuiGetMsg()
        Case $button1
            $aktion1 = True
        Case $button2
            $aktion1 = False
        ....
    EndSwitch
    If $aktion1 Then
        ;aktion1
    EndIf
WEnd
da du dich ja sowieso in einer endlosschleife befindest, wird so aktion1 immer ausgeführt, wenn sie durch $button1 aktiviert wurde.
11/10/2010 16:25 Belur#44
Okay. Das klappt. =)

Hab nur das Problem:

PHP Code:
If $akt1 True Then ControlSend($handle,"","""{" $iCombo1 "}"
$iCombo ist definiert als:
PHP Code:
$iCombo1 GUICtrlRead($Combo1
Wenn ich zB in der Combobox F1 habe sender der aber nicht F1 sondern immer die Taste "C". Das ist ingame ein Action Slot. Das gilt nicht nur F1 sondern für alle Tasten in der Combo Box.

Immer wird nur C gesendet. Weiß jmd warum?
11/10/2010 16:56 .Infinite#45
F1 is vllt die Hex Entsprechung von "C". Hast du F1 auch mit {F1} gesendet oder nur so? Wobei dann müsste er eigentlich einfach "F1" schreiben...

Poste doch einfach mal das komplette Programm und nicht immer nur codeschnipsel. Wenn man alles vorliegen hat, kann man alles viel besser verstehen und sich reindenken. So kann man immer nur spekulileren, was du eigentlich vor hast.