GWCA Bot an einen Charakter binden

01/31/2010 02:52 Garry goes Sheep#1
Gute Nacht allerseits

Ich wurde in meinem Chestbot-Thread gefragt, ob man eine Funktion einbauen könne, bei der man den Namen seines Charakters eingibt, weil der Bot sonst seine Befehle an das falsche GW senden kann, wenn man mehrere GWs gleichzeitig am Laufen hat.

Ich würd das ganze gerne per .ini regeln.
Wenn der Parameter $CharName "variabel" ist (also so in der .ini eingestellt wird), soll eine Abfrage beim Botstart erfolgen, bei der man den Charakternamen eingibt. Der Bot soll dann selbstverständlich die Befehle nur an das GW mit dem richtigen Namen senden.

Wenn der Parameter nicht "variabel" ist sondern ein Name, in diesem Fall natürlich der Charaktername, dann soll der Bot ohne Abfrage starten und die Befehle logischerweise nur an dieses Fenster schicken.

Meine Überlegungen führen bisher so weit: Wären diese richtig?

Code:
Global $GuildWarsWindowName

Const $CharName = IniRead("Chestbot.ini", " General Settings ", "$CharName", "Not found")

SetGuildWarsName()

Chestbot() ;Rest des Bots eben...

Code:
Func SetGuildWarsName()
	If $CharName = "variabel" Then
		$InputName = InputBox("Name", "Enter your Character's Name:")
		$GuildWarsWindowName = "Guild Wars - " & $InputName
		TraySetToolTip($sInputName)
	ElseIf $CharName <> "variabel" Then
		$GuildWarsWindowName = "Guild Wars - " & $CharName
	EndIf
EndFunc
Wenn nun dies für sich schon mal richtig ist, wie bringe ich dann den Bot dazu, die Befehle an das richtige Guild Wars (mit dem Namen $GuildWarsWindowName) zu senden?

Danke schonmal im Voraus!
01/31/2010 04:21 solos#2
Müsste doch eigtl so gehen:

Quote:
Global $hwnd = WinGetHandle($GuildWarsWindowName)

$cGUI = GUICreate("GWCA " & $GuildWarsWindowName)
GUIRegisterMsg(0x500, "WndCallback")
Global $PID = WinGetProcess($hwnd)
01/31/2010 11:21 Garry goes Sheep#3
Scheint zu funktionieren, ja;)

Wie könnte man noch eine Funktion einbauen, die den Bot beendet, wenn das entsprechende Guild Wars Fenster nicht gefunden wurde (weil der Name falsch geschrieben ist)? Am besten noch mit ner Fehlermeldung, damit sich der Benutzer auskennt.

Danke schonmal und Danke für die bisherige Hilfe;)

Edit: Nein...verdammt. Der Bot läuft auch weiter, wenn der Name falsch geschrieben ist, dabei müsste er die Befehle dann an ein nicht vorhandenes GW schicken.
01/31/2010 20:21 buFFy!#4
Einmal mit dem WinHandle (um zu überprüfen ob es existiert - muss bereits einmal existiert haben!)

Code:
Func checkWin($hWnd)
	If HWnd($hWnd) = 0 Then Exit
EndFunc
Und einmal mit WinName

Code:
Func checkWin($sWinName)
	Local $hWnd = WinGetHandle($sWinName)
	If HWnd($hWnd) = 0 Then Exit
EndFunc
Aufruf:
Code:
Func checkWin($sWinName)
	Local $hWnd = WinGetHandle($sWinName)
	If HWnd($hWnd) <> 1 Then Exit
EndFunc

$pName = "Strong Elitepvper"
$sWinName = "Guild Wars - " & $pName

checkWin($sWinName)
Und das hier könnte evtl. noch hilfreich sein.
Code:
;returns the hwnd of a given windowtitle
;sWinName = Window Title
;limi = timeout in seconds (default = 3)
Func safeFindWindow($sWinName, $limit = 3)
	Opt('WinTitleMatchMode', 3)
	Local $hWnd = WinGetHandle($sWinName)
	Local $timeout = 0
	If HWnd($hWnd) = 0 Then
		While  HWnd($hWnd) = 0 Or $timeout > $limit
			$hWnd = WinGetHandle($sWinName)
			Sleep(1000)
			$timeout += 1
		WEnd
	EndIf
	Opt('WinTitleMatchMode', 1)
	Return $hWnd
EndFunc
bei safeFindWindow ist zu sagen, das es dort auch um Groß und Kleinschreibung geht.
01/31/2010 23:30 Garry goes Sheep#5
Ok, danke. Die Abfrage, ob das "benötigte GW" vorhanden ist, funktioniert.

Aber ich hab immer noch das Problem, dass der Bot gar nicht die Befehle an eben genau dieses eine "richtige" GW schickt.
Egal welchen Namen ich eingebe (und egal ob per .ini oder per Userabfrage)...

Der Bot beendet sich zwar jetzt, da die Überprüfung von U-Core ihn dazu zwingt, sich zu beenden. Aber wenn ich die Abfrage nicht durchführen lasse, läuft der Bot weiter, ganz egal mit welchen Namen usw.
02/01/2010 16:01 buFFy!#6
oben ans skript
Code:
Opt('WinTitleMatchMode', 3)
02/02/2010 17:27 Garry goes Sheep#7
Ich poste nochmal eben, was ich jetzt rund um die "Namensgebung" im Skript habe.
Wenn ich das Skript so starte, passiert nichts, also es erfolgt keine Abfrage, unabhängig von irgendwelchen Namen und der Bot beendet sich sofort wieder.
Tut mir wirklich Leid, wenn ich euch aufn Sack gehe. Ich versuch's, aber ich krieg's einfach nicht auf die Reihe...

Code:
Opt('WinTitleMatchMode', 3)
Global $cGUI = GUICreate("GWCA")
GUIRegisterMsg(0x500, "WndCallback")

Global $sWinName

Const $CharacterName = IniRead("Chestbot.ini", " General Settings ", "$CharName", "Not found")


SetGuildWarsName()
;Chestruns usw...

Func SetGuildWarsName()
	If $CharacterName = "variabel" Then
		$InputName = InputBox("Name", "Enter your Character's Name:")
		$sWinName = "Guild Wars - " & $InputName
	ElseIf $CharacterName <> "variabel" Then
		$sWinName = "Guild Wars - " & $CharacterName
	EndIf
	
	Local $hWnd = WinGetHandle($sWinName) ;Check if a Window named $sWinName exists
	If HWnd($hWnd) <> 1 Then Exit
	
EndFunc
02/04/2010 15:37 Garry goes Sheep#8
*up*...?^^
02/05/2010 12:37 buFFy!#9
Code:
Func GetClientName($sCharName)
	Local $nChar = $sCharName
	Local $sWinName = 'Guild Wars - '

	Switch StringLower($nChar)
		Case "variabel"
			$nChar = InputBox("Name", "Enter your Character's Name!")
			Local $hWnd = WinGetHandle($sWinName)
			If HWnd($hWnd) <> 1 Then Return -1
			$sWinName &= $nChar
			Return ($sWinName)
		Case "not found"
			$nChar = InputBox("Name", "Enter your Character's Name!")
			Local $hWnd = WinGetHandle($sWinName)
			If HWnd($hWnd) <> 1 Then Return -1
			$sWinName &= $nChar
			Return ($sWinName)
		Case Else
			Local $hWnd = WinGetHandle($sWinName)
			If HWnd($hWnd) <> 1 Then Return -1
			$sWinName &= $nChar
			Return ($sWinName)
	EndSwitch
EndFunc   ;==>GetClientName
02/06/2010 12:32 buFFy!#10
Nimm mal die Funktion so, die andere war Fehlerhaft.
Code:
Func GetClientName($sCharName)
	Local $nChar = $sCharName
	Local $sWinName = 'Guild Wars - '

	Switch StringLower($nChar)
		Case "variabel"
			$nChar = InputBox("Name", "Enter your Character's Name!")
			Local $hWnd = WinGetHandle($sWinName)
			If HWnd($hWnd) <> 1 Then Return -1
			$sWinName &= $nChar
			Return ($sWinName)
		Case "not found"
			$nChar = InputBox("Name", "Enter your Character's Name!")
			Local $hWnd = WinGetHandle($sWinName)
			If HWnd($hWnd) <> 1 Then Return -1
			$sWinName &= $nChar
			Return ($sWinName)
		Case Else
			Local $hWnd = WinGetHandle($sWinName)
			If HWnd($hWnd) <> 1 Then Return -1
			$sWinName &= $nChar
			Return ($sWinName)
	EndSwitch
EndFunc   ;==>GetClientName