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 Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
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
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.
PHP Code:
//Zeichen für Zeichen der ID an das Spiel senden mit einer For-Schleife
For x As Integer = 0 To ID.Length -1
SendMessage(sroHwnd, WM_CHAR, AscW(ID(x)), 0)
Next
//TAB senden, damit man ins Passwort-Feld gelangt (falls nötig)
SendMessage(sroHwnd, WM_CHAR, AscW(Chr(TAB)), 0)
//Beim Passwort nun das gleiche wie bei der ID
For x As Integer = 0 To PW.Length -1
SendMessage(sroHwnd, WM_CHAR, AscW(PW(x)), 0)
Next
//Zum Schluss Enter senden (falls nötig), das gleiche wie beim Tabulator
SendMessage(sroHwnd, WM_CHAR, AscW(Chr(ENTER)), 0)
Hier nochmal, der komplette Code:
PHP Code:
Public Class SRO_SendMessage
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal 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.Object, ByVal e As System.EventArgs) Handles btnSendLogin.Click
sroHwnd = Process.GetProcessesByName("SRO_Client")(0).MainWindowHandle
For x As Integer = 0 To ID.Length -1
SendMessage(sroHwnd, WM_CHAR, AscW(ID(x)), 0)
Next
SendMessage(sroHwnd, WM_CHAR, AscW(Chr(TAB)), 0)
For x As Integer = 0 To PW.Length -1
SendMessage(sroHwnd, WM_CHAR, AscW(PW(x)), 0)
Next
SendMessage(sroHwnd, WM_CHAR, AscW(Chr(ENTER)), 0)
End Sub
End Class
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 Integer, ByVal hwndChildAfter As Integer, ByVal lpszClass As String, ByVal 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(sroHwnd, 0, "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")
Viel Spaß beim Ausprobieren!






