Text an minimiertes Fenster senden

03/19/2011 18:51 Kraizy​#1
Hi,
wollte euch mal zeigen, wie ihr einen Text an ein Fenster/Spiel sendet, welches sich im Hintergrund befindet. Bei diesem kleinen Tutorial nehme ich das Spiel Silkroad Online, und werde einen kleinen "Autologin" bauen, der eure ID/PW eingibt und ENTER drückt. Das ganze in VB.NET (kann leider kein C++^^)

Also, als erstes die benötigte WinAPI:
PHP Code:
//SendMessage
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntegerByVal wMsg As IntegerByVal wParam As IntegerByVal lParam As Integer) As Integer 
Nun noch einige Deklarationen:
PHP Code:
Private Const WM_CHAR As Integer = &H102
Private Const ENTER As Integer 13
Private Const TAB As Integer 9

Private ID As String "test123"
Private PW As String "blubb123"
Private sroHwnd As IntPtr Nothing 
So, jetzt kann es eigentlich auch schon losgehen.
Per Button oder wie auch immer, suchen wir das Handle von unserem Spiel und übergeben es unserer Variable "sroHwnd":
PHP Code:
sroHwnd Process.GetProcessesByName("SRO_Client")(0).MainWindowHandle
//anstelle von "SRO_Client" müsst ihr den Prozessnamen eures Fensters angeben, aber ohne .exe am Ende. 
Nun haben wir das Handle gefunden und können unsere Account-Daten schicken:
PHP Code:
//Zeichen für Zeichen der ID an das Spiel senden mit einer For-Schleife
For As Integer 0 To ID.Length -1
   SendMessage
(sroHwndWM_CHARAscW(ID(x)), 0)
Next

//TAB senden, damit man ins Passwort-Feld gelangt (falls nötig)
SendMessage(sroHwndWM_CHARAscW(Chr(TAB)), 0)

//Beim Passwort nun das gleiche wie bei der ID
For As Integer 0 To PW.Length -1
   SendMessage
(sroHwndWM_CHARAscW(PW(x)), 0)
Next

//Zum Schluss Enter senden (falls nötig), das gleiche wie beim Tabulator
SendMessage(sroHwndWM_CHARAscW(Chr(ENTER)), 0
So, das wars eigentlich auch schon, Enter wird in diesem Beispiel nur einmal gesendet, aber ihr könnt es ja in eine Schleife packen, ist also kein Problem.

Hier nochmal, der komplette Code:
PHP Code:
Public Class SRO_SendMessage

   
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntegerByVal wMsg As IntegerByVal wParam As IntegerByVal lParam As Integer) As Integer
    
   
Private Const WM_CHAR As Integer = &H102
   
Private Const ENTER As Integer 13
   
Private Const TAB As Integer 9

   
Private ID As String "test123"
   
Private PW As String "blubb123"
   
Private sroHwnd As IntPtr Nothing

   
Private Sub btnSendLogin_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles btnSendLogin.Click

      sroHwnd 
Process.GetProcessesByName("SRO_Client")(0).MainWindowHandle

      
For As Integer 0 To ID.Length -1
         SendMessage
(sroHwndWM_CHARAscW(ID(x)), 0)
      
Next

      SendMessage
(sroHwndWM_CHARAscW(Chr(TAB)), 0)

      For 
As Integer 0 To PW.Length -1
         SendMessage
(sroHwndWM_CHARAscW(PW(x)), 0)
      
Next

      SendMessage
(sroHwndWM_CHARAscW(Chr(ENTER)), 0)

   
End Sub
        
End 
Class 
So, hoffe ich konnte euch damit ein wenig helfen und bei Fragen könnt ihr gerne hier reinschreiben oder mich in Skype adden: k0La_xD

Achja, das ganze funktioniert leider nicht bei allen Spielen, wie z.B. Counter Strike usw. (naja, ich hab es noch nicht ausprobiert kann mich natürlich auch irren) und bei manchen Fenstern müsst ihr das richtige Handle erstmal finden, wenn ihr z.B. beim Notepad das MainWindowHandle benutzt, dann wird der Fenstername überschrieben. Um es zu zeigen:
Ihr benötigt dann noch folgende WinAPI:
PHP Code:
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As IntegerByVal hwndChildAfter As IntegerByVal lpszClass As StringByVal lpszWindow As String) As Integer

//dann fügt ihr in meinem obigen Komplett-Code unter die Zeile sroHwnd = Process.GetProcessesByName... 
//noch folgendes ein:
Dim childHwnd As IntPtr FindWindowEx(sroHwnd0"Edit"vbNullString)
//"Edit" ist der Klassenname der TextBox die sich im Notepad befindet, um die richtigen Handles zu finden ist das Tool 
//Spy++ oder WinID empfehlenswert..
//Danach ändert ihr in den Schleifen wo SendMessage(...) benutzt wird das "sroHwnd" zu "childHwnd" und nun 
//müssten die ID & PW im Notepad drinne stehen (und nicht vergessen den richtigen Prozessnamen (notepad) 
//anzugeben, anstatt "SRO_Client") 
Soo, jetzt aber wirklich fertig^^
Viel Spaß beim Ausprobieren!
03/21/2011 09:20 lalalala2#2
... Was soll das sein?
03/21/2011 14:25 Kraizy​#3
Quote:
Originally Posted by lalalala2 View Post
... Was soll das sein?
Da ich schon öfters die Frage gelesen habe, wie man einen Text an ein Spiel wie z.B. Silkroad senden kann, wenn es im Hintergrund ist, wollte ich eine Möglichkeit zeigen, wie es mit der WinAPI SendMessage und dem richtigen Handle funktioniert..
03/21/2011 15:30 5769854332#4
Ob ein Fenster minimiert oder maximiert ist, im Vordergrund oder im Hintergrund, etc. ist eig egal - es kann immer Nachrichten empfangen.
ich verstehe daher den Sinn des Tutorials nicht so ganz...
03/21/2011 15:46 Kraizy​#5
Quote:
Originally Posted by Kiakar View Post
Ob ein Fenster minimiert oder maximiert ist, im Vordergrund oder im Hintergrund, etc. ist eig egal - es kann immer Nachrichten empfangen.
Wenn ein Fenster im Hintergrund ist, kannst du z.B. in .NET nicht einfach SendKeys.Send("w") benutzen, da das einfach abgeschickt wird. Sagen wir mal du hast ein Spiel an, das sich im Hintergrund befindet und schreibst hier im Forum gerade einen Beitrag und benutzt SendKeys.Send("w"), dann wirst du in deinem Beitrag das "w" sehen, im Spiel jedoch nichts...

Ich denke, ich habs wohl im falschen Bereich gepostet, sollte wohl lieber ins e*pvp Coders Tutorials kommen...
03/21/2011 16:08 Mostey#6
#moved