Guten Morgen allerseits,
wünsche jedem einen guten Start in die Woche. Ich persönlich habe mir die komplette Nacht um die Ohren gehauen um eine Idee zu verwirklichen, von der ich ausging, dass es im Grunde machbar sein sollte. Bin dabei jedoch auf ein paar Probleme gestoßen und suche seitdem nach einer Lösung. Leider bekomme ich langsam das Gefühl, dass es weitaus komplizierter ist als geahnt. Daher Frage ich einfach mal euch was ihr davon haltet. Ich möchte dazu sagen, dass ich seit Jahren mit AutoIT arbeite, allerdings nie wirklich etwas großes. Allerdings kenne ich mich mitlerweile etwas aus und lerne sehr schnell, sofern es etwas content gibt. Studiere atm Informatik und hatte früher viel mit C++ zu tun. Also nicht ganz untalentiert.
Die Idee klingt zuerst sehr einfach: Ich spiele auf PokerStars des öfteren etwas Poker. Dort gibt es eine Suchfunktion (Strg+F) welche das Fenster "Find a Player" öffnet. Hier kann man nun einen Spielernamen eingeben und sich in einem neuen ("Find a Player")-Fenster anzeigen lassen, in welchen Turnieren er gerade sitzt (sofern dieser diese Funktion nicht in den Optionen deaktiviert hat). Bis hierhin nichts besonderes.
Mein Plan ist jedoch, die Suchfunktion z.B. alle 10-30 Sekunden automatisch laufen zu lassen, sodass ich meinem Freund folgen kann, sobald er z.B. in einem MultiTableTournament (MTT) zufällig auf einen anderen Tisch gesetzt wird, ohne, dass ich erneut manuell nach ihm suchen muss. Also absolut nichts verbotenes! Ich möchte lediglich die Such-Funktion automatisieren. Habe mir dafür ein nützliches GUI gebastelt, wo ich neue Spieler hinzufügen/löschen kann.
Da ich wärend das automatisierte Such-script läuft, gleichzeitig selbst Pokern und am PC arbeiten möchte ist es wichtig, dass die Suchbefehle im Hintergund ausführbar sind was das ganze leider etwas erschwert.
So siehts aus, wenn man STRG+F drückt:
Die Window-Infos zum Editfeld des Fensters:
Problem #1: Habe es vorerst auf die einfachste Art probiert. Mit WinExists("PokerStars Lobby") erstmal prüfen ob die PokerStars Lobby geöffnet ist, np. Doch selbst wenn ich WinAvtivate benutze kann ich durch den Send("^!F") nicht die Suchfunktion öffnen. War sowieso nicht mein Plan, weshalb ich mit dem WinInfo-Tool versuchte die nötigen Infos auszulesen, um diese direkt und wenn möglich auch im Hintergrund auszuführen. Würde es mit ControlSend("Find a Player", "", "[CLASS:Edit; INSTANCE:1]", "Spielername") versuchen, komme aber nicht dazu, das Fenster überhaupt zu öffnen. Gibt es da weitere Möglichkeiten um das Suchen-Fenster, wenn möglich, im Hintergrund zu öffnen/auszuführen? Will hier Pixel/Picture-Search gänzlich vermeiden. Wenn möglich nur den Befehl senden und die Infos abfangen, ohne, dass man dabei bei der Arbeit am PC beeinträchtigt oder getört wird. Da es sich um eine Funktion eines fremden Programmes handelt weis ich nicht ob das überhaupt geht.
Hat man erst einmal jemanden eingegeben, den man suchen möchte, so öffnet sich folgendes Fenster:
Die Infos zum ListCLass:
Problem #2: Hier ist das Ziel, jeden angezeigten Tisch (üblich mit Doppellclick) zu öffnen und anzeigen zu lassen, solange der gesuchte Spieler daran sitzt. Steht der Spieler auf, soll der Tisch wieder geschlossen werden. Das schliessen ist dabei das kleinste Hinderniss. Die Frage ist hier im Grunde die selbe, nämlich ob es hier nun auch eine Möglichkeit gibt das Programm durchlaufen zu lassen ohne es tatsächlich zu sehen und trotzdem jede Spalte(Tisch) der Liste irgendwie zu öffnen.
Gibt es einen Weg an den ich nicht gedacht habe? Speicher auslesen mit ner APIHook scheint etwas zu extrem und PixelSearch zu einfach, da das Programm wenn möglich im Hintergrund ablaufen soll. Wenn jemand einen Lösungsvorschlag, eine Idee oder Richtung kennt, die mir hier weiterhelfen könnte wäre ich für jede Inspiration sehr dankbar. Falls Ihr mehr Informationen benötigt, gebt mir bescheid, dann tue ich mein Bestes um euch diese schnellstmöglich zu liefern. PokerStars ist zudem kostenlos downloadbar, falls sich jemand mal intensiever daran probieren möchte. Hier ist mein Code. Ist ja noch am Anfang aber macht ja wenig Sinn weiter zu machen, sofern derartige Probleme unklar sind. Nicht wundern, dass hier keine falschen Lösungsansätze drinstehen, macht ja keinen Sinn, wenn es nicht funktioniert.
Code:
Spoiler anzeigen
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
;declarations
Dim $msg, $Window_Menue, $Menue_File, $Menue_Help, $hListView, $Menue_ListView, $Button_Start, $Button_Stop, $Button_Exit, $Button_AddPlayer, $NewPlayer, $YesOrNo, $TrackingInAction = 0
Sleep(300)
$Window_Menue = GUICreate("ShadowTracker v1.0", 790, 340, 1000, 350)
$Menue_File = GUICtrlCreateMenu("File")
$Menue_File_1 = GUICtrlCreateMenuItem("Add Player", $Menue_File)
$Menue_File_2 = GUICtrlCreateMenuItem("Delete All", $Menue_File)
$Menue_File_3 = GUICtrlCreateMenuItem("Exit", $Menue_File)
$Menue_Help = GUICtrlCreateMenu("Help")
$Menue_Help_1 = GUICtrlCreateMenuItem("Support", $Menue_Help)
$hListView = GUICtrlCreateListView("Player|Track|Live|Active Tables|Time (hours)|Last action", 130, 10, 650, 300, -1)
$Menue_ListView = GUICtrlCreateContextMenu($hListView)
$Menue_ListView_1 = GUICtrlCreateMenuItem("Track On/Off", $Menue_ListView)
$Menue_ListView_2 = GUICtrlCreateMenuItem("Reset Time(hours)", $Menue_ListView)
$Menue_ListView_3 = GUICtrlCreateMenuItem("Delete", $Menue_ListView)
_GUICtrlListView_SetColumnWidth($hListView, 0, 150)
_GUICtrlListView_SetColumnWidth($hListView, 1, 50)
_GUICtrlListView_SetColumnWidth($hListView, 2, 60)
_GUICtrlListView_SetColumnWidth($hListView, 3, 90)
_GUICtrlListView_SetColumnWidth($hListView, 4, 100)
_GUICtrlListView_SetColumnWidth($hListView, 5, 195)
$Button_Start = GUICtrlCreateButton("Start Tracking", 10, 10, 100, 20)
$Button_Stop = GUICtrlCreateButton("Stop Tracking", 10, 40, 100, 20)
$Button_Exit = GUICtrlCreateButton("Close", 10, 290, 100, 20)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
case -3
$YesOrNo = MsgBox(1, "Exit", "Do you want to close ShadowTracker?")
If $YesOrNo == 1 Then
Exit
EndIf
case $Button_Start
$TrackingInAction = 1
_CheckLobby()
case $Menue_File_1
$NewPlayer = InputBox("Add new Player", "Enter new players name:", "", "", 200, 120)
GUICtrlCreateListViewItem($NewPlayer & '|' & "ON" & '|' & "" & '|' & "" & '|' & "" & '|' & "", $hListView)
case $Menue_File_2
_DeleteAll()
case $Menue_File_3
$YesOrNo = MsgBox(1, "Exit", "Do you want to close ShadowTracker?")
If $YesOrNo == 1 Then
Exit
EndIf
case $Menue_ListView_1
case $Menue_ListView_2
case $Menue_ListView_3
_DeletePlayer()
case $Button_Stop
$TrackingInAction = 0
case $Button_Exit
$YesOrNo = MsgBox(1, "Exit", "Do you want to close ShadowTracker?")
If $YesOrNo == 1 Then
Exit
EndIf
EndSwitch
WEnd
Func _CheckLobby()
If WinExists("PokerStars Lobby") Then
MsgBox(0, "Client found", "Poker-Client ready", 3)
Else
MsgBox(0, "Client not found!", "Poker-Client not found!", 3)
EndIf
EndFunc
Func _DeletePlayer()
_GUICtrlListView_DeleteItemsSelected($hListView)
EndFunc
Func _DeleteAll()
$YesOrNo = InputBox("Caution", "You are about to DELETE all Players statistics! If you want to preceed type 'YES'")
If $YesOrNo == "YES" Then
_GUICtrlListView_DeleteAllItems($hListView)
MsgBox(0, "Delete complete", "All Players deleted", 5)
EndIf
EndFunc
Func _TrackMode()
EndFunc
Das GUI könnte dann etwa so aussehen:
ich hoffe auf eure Unterstützung!
euer noXQses