Control Send = ich verstehs nicht

08/02/2009 19:14 HardCore.1337#1
Hallo, wie einige wissen arbeite ich zurzeit an meinen TQ Farm Bot.
Der eigentliche Bot ist fertig, doch nun will ich auch das fenster minimieren wollen, damit ich nebei auch noch andere Games zocken/Internet surfen kann.

Nur mein problem: Irgendwie geht gar nix.
Hab mir mal nen kleinen testscript angelegt um damit zu üben.

PHP Code:
$client = ("Guild Wars"

;
Bisschen zeit lassendamit ich GW öffnn kann
sleep
(8000)

;
Test Script beginnen
WinSetState
($client"", @SW_HIDE) ;Fenster verkleinern
sleep
(1000)
ControlSend($client"""""o"1) ;In dem prozess "Guild Wars" o drücken 
ControlSend
($client"""""{Space}"1) ;" Leertaste drücken
sleep (12000)
WinSetState(
$client, "", @SW_SHOW ); fenster wieder vergrößern um Ergebnis zu überprüfen 
Also, das verkleinern und vergrößern geht. Aber die Tastendrücke funktionieren gar nicht. Weder wird O noch leer gedrückt. Das einzige was offen war, war die gruppensuche.

Und dann nochwas. Wenn es mal funktioniert, kann ich Controlsend dann überall in meinen jetigen Code einfügen? Also aus

PHP Code:
...
send ("1")
sleep($ZA)
send ("{Space}")
... 
wird dann..?

PHP Code:
Controlsend ("Guild Wars""""""1"1)
sleep ($ZA)
Controlsend ("Guild Wars""""""{Space}"1

Außerdem weiß ich nicht wie ich /resign eingeben soll...
/resign so geht ja nicht.
Und wenn ich es folgendermaßen mache gehts auch nicht

PHP Code:
ControlSend($client"""""+7")
sleep(500)
ControlSend($client"""""resign"
Er erkennt irgendwie das "/" nicht. Muss ja theoretisch Umaschalt + 7 drücken.

P.S. [Only registered and activated users can see links. Click Here To Register...] hab ich gelesen...funktioniert aber nicht


Markus
08/02/2009 21:57 Rosemarie Lein#2
Minimieren is nich, nur im Hintergrund haben.
Sonst, schau dir mal Opt MouseClickDelay und Opt SendKeyDelay und den ganzen Spaß an.
08/02/2009 22:08 HardCore.1337#3
ne, oder`?

geht das sonst gar nicht?
08/03/2009 00:49 Rosemarie Lein#4
Quote:
Originally Posted by General Desert View Post
ne, oder`?

geht das sonst gar nicht?
Fenster kann versteckt sein, es darf aber nich minimiert sein
08/03/2009 09:23 HardCore.1337#5
Mit welchem befehl kann ich es verstecken?
Ach und dann nochwas. Wenn es "minimiert" ist, klappt ControlClick nicht

PHP Code:
ControlClick($client"""""left"1827545
Da pssiert rein gar nix
08/03/2009 15:02 Rosemarie Lein#6
Quote:
Originally Posted by Rosemarie Lein View Post
Fenster kann versteckt sein, es darf aber nich minimiert sein
Quote:
Originally Posted by General Desert View Post
Wenn es "minimiert" ist, klappt ControlClick nicht
^^
Quote:
Originally Posted by General Desert View Post
Mit welchem befehl kann ich es verstecken?
Quote:
Originally Posted by General Desert View Post
PHP Code:
WinSetState($client"", @SW_HIDE
;)
08/03/2009 15:48 HardCore.1337#7
OK, ich habs jetzt so

PHP Code:
HotKeySet("{NUMPADSUB}""_mini")
HotKeySet("{NUMPADADD}""_maxi")

...

Func _mini()
    
$client WinGetTitle """")
    
Sleep(50)
    
WinSetState($client"", @SW_HIDE )
EndFunc

Func _maxi
()
    
WinSetState($client"", @SW_SHOW )

    If 
WinActive($clientThen
    
Else
        
WinActivate($client)
    EndIf
EndFunc 
Das geht ja noch alles.(Fenster wird jetzt versteckt oder?)
Aber jetzt

PHP Code:
;Zurück
sleep
(3000)
ControlSend($client"""""{Enter}"0)
ControlSend ($client"""""{Up}"0)
ControlSend($client"""""{Enter}"0)
sleep(2000)

;
Resign Button drücken
sleep
(1500)
ControlClick($client"""""left"1827545)
sleep(3000
Resign eingeben geht auch noch, aber die maus wandert einfach nicht auf den Button
08/03/2009 17:02 emtec22#8
ControlClick($client, "", "", "left", 1, 827, 545) ist etwas buggy leider du solltest da mal nach _MouseClickPlus suchen damit kannst du alles ansprechen und klicken
08/03/2009 18:01 | Moep |#9
guck dir mal den tread an: "[Only registered and activated users can see links. Click Here To Register...]
08/08/2009 23:01 HardCore.1337#10
Gut, die Texteingaben hab ich. Nur da ControlClick nicht richtig geht, hab ich mal bischen gegoogelt und bin auf den Link gestoßen.

[Only registered and activated users can see links. Click Here To Register...]

Die dll hab ich runtergeladen und wollte sie gleichmal testen. Nur leider komm ich mit dem Aufruf mit dll nicht wirklich klar. kann mir jmd helfen pls?

mein Code:

PHP Code:
  Func Maus ()
      
DllCall("Functions.dll","int","fnSetCursorPos","int"1400"int"1200)
EndFunc

;Maus bewegen

WinWaitActive 
("Guild Wars1")
sleep (3000)
Maus ()
sleep(5000
Tut sich leider gar nix.

Laut der Hilfe muss sie aber so ähnlich aufgerufen werden.
PHP Code:

$Fenster 
WinGetHandle("Guild Wars")

$X 300

$Y 
200

$LPARAM 
_MakeLong(300,200)

DllCall("Functions.dll","int","fnSetCursorPos","in t"300"int"200
08/10/2009 17:15 HardCore.1337#11
keiner ne idee?
08/10/2009 21:02 buFFy!#12
Deine Lösung:
Code:
Opt('SendKeyDelay', 150)
Opt('SendKeyDownDelay', 150)

$hwnd = WinGetHandle('Guild Wars')
WinSetState($hwnd, "", @SW_HIDE)
Sleep(1000)
ControlSend($hwnd, "", "", "{enter}" & "hello")
Sleep(1000)
WinSetState($hwnd, "", @SW_SHOW)
Allerdings erzeugt ControlSend nach einiger Zeit einen Stackoverflow, was zu Problemen (sehr nervig!) mit der Shift-Taste führt.
Darum empfehle ich dir meine Funktion dafür zu verwenden.

Code:
#include <WindowsConstants.au3>
; #FUNCTION# ====================================================================================================================
; Name...........: SimulKey
; Description ...: Simulate a Key-Send to a specified handle in the Background
; Author ........: Felix Lehmann
; Modified.......: If you modify this Script, please enter your name here
; Remarks .......: -
; Related .......: -
; Parameters ....: $hwnd = Specified Window to Send to
; ...............: $key = Key or String to Send (If String $string have to be enabled [see $string])
; ...............: $string = Set this to 1 If your "$key" is a string
; ...............: $state = Set this to 'up' or 'down' if u want a special event | Default is press the Key 1 Time
; ...............: $delay = The delay to hold the key down
; Return Values .: 1 = Done | -1 = Couldn't load user32.dll
; Link ..........; -
; ===============================================================================================================================
Func SimulKey($hWnd, $key, $string = 0, $state = 'skip', $delay = 10)
	;//Open DLL (user32)
	$user32 = DllOpen('user32.dll')
	If $user32 = -1 Then
		SetError(-1, 1, -1)
	EndIf

	;//Handle Special Keys
	Switch StringLower($key)
		Case 'enter'
			$WM_ENTER = 0x0d
			$dCall = DllCall($user32, 'int', "MapVirtualKey", 'int', $WM_ENTER, 'int', 0)
			$lParam = BitOR(BitShift($dCall[0], -16), 1)
		Case 'space'
			$WM_SPACE = 0x20
			$dCall = DllCall($user32, 'int', "MapVirtualKey", 'int', $WM_SPACE, 'int', 0)
			$lParam = BitOR(BitShift($dCall[0], -16), 1)
		Case 'tab'
			$WM_TAB = 0x09
			$dCall = DllCall($user32, 'int', "MapVirtualKey", 'int', $WM_TAB, 'int', 0)
			$lParam = BitOR(BitShift($dCall[0], -16), 1)
			;//Handle Standard Keys
		Case Else
			;//Stringmode 1
			If $string = 1 Then
				$split = StringSplit($key, "")
				For $ctn = 1 To $split[0]
					$split[$ctn] = Asc(StringLower($split[$ctn]))
				Next
				For $ctn = 1 To $split[0]
					$dCall = DllCall($user32, 'int', "VkKeyScan", 'int', $split[$ctn])
					$lParamAsc = DllCall($user32, 'int', "MapVirtualKey", 'int', $dCall[0], 'int', 0)
					$lParam = BitOR(BitShift($lParamAsc[0], -16), 1)
					$lUpParam = BitOR($lParam, 0xC0000000)
					DllCall($user32, 'int', "PostMessage", 'hwnd', $hWnd, 'int', $WM_KEYDOWN, 'int', $dCall[0], 'int', $lParam)
					Sleep($delay)
					DllCall($user32, 'int', "PostMessage", 'hwnd', $hWnd, 'int', $WM_KEYUP, 'int', $dCall[0], 'int', $lUpParam)
					Sleep(10)
				Next
				;//Stringmode 0
			ElseIf $string = 0 Then
				$key = Asc(StringLower($key))
				$dCall = DllCall($user32, 'int', "VkKeyScan", 'int', $key)
				$lParamAsc = DllCall($user32, 'int', "MapVirtualKey", 'int', $dCall[0], 'int', 0)
				$lParam = BitOR(BitShift($lParamAsc[0], -16), 1)
			EndIf
	EndSwitch
	$lUpParam = BitOR($lParam, 0xC0000000)
	If $string = 0 Then
		Switch StringLower($state)
			Case 'skip'
				DllCall($user32, 'int', "PostMessage", 'hwnd', $hWnd, 'int', $WM_KEYDOWN, 'int', $dCall[0], 'int', $lParam)
				Sleep($delay)
				DllCall($user32, 'int', "PostMessage", 'hwnd', $hWnd, 'int', $WM_KEYUP, 'int', $dCall[0], 'int', $lUpParam)
			Case 'down'
				DllCall($user32, "int", "PostMessage", "hwnd", $hWnd, "int", $WM_KEYDOWN, "int", $dCall[0], "int", $lParam)
			Case 'up'
				DllCall($user32, "int", "PostMessage", "hwnd", $hWnd, "int", $WM_KEYUP, "int", $dCall[0], "int", $lParam)
		EndSwitch
	EndIf
	DllClose($user32)
	Return 1
EndFunc   ;==>SimulKey
Und noch ein passendes Beispiel zur verwendung wie du das ganze von oben mit Simulkey lösen kannst.

Code:
;/Wichtig
#include <WindowsConstants.au3>

$hwnd = WinGetHandle('Guild Wars')
WinSetState($hwnd, "", @SW_HIDE)
SimulKey($hwnd, 'enter')
Sleep(1000)
SimulKey($hwnd, 'hello', 1, 'skip', 100)
WinSetState($hwnd, "", @SW_SHOW)
Resignansatz ohne "/":
Code:
;/Wichtig
#include <WindowsConstants.au3>

$hwnd = WinGetHandle('Guild Wars')

SimulKey($hwnd, '-resign', 1, 'skip', 100)
Sleep(100)
SimulKey($hwnd, 'enter')
10/21/2009 19:51 HardCore.1337#13
Sry das ich nochma Anfange mit dem thema...

ich habe jetzt alles probiert.
-- ControlClic
-- MouseClick Plus
-- tt6

und alles mit zeitverzögerung. und ja, ich habe das fenster nicht minimiert sondern versteckt (@SW_HIDE)

Das klappt aber alles nicht. Hab mir jetzt extra Windows XP wegen 32Bit wieder draufgemacht. Ich könnte heulen

Hat jmd einen beispiel Script oder so??

mfg
markus
10/21/2009 19:57 Syc0n#14
Nehm Mousesend aus der tt6.
10/21/2009 19:59 HardCore.1337#15
Funkt ja nicht

so ne kacke mit dem ControlSend^^
langsam ni mehr lustig