SendMessage Tutorial

01/05/2014 18:18 BendiStyle#61
Danke Kraizy ich wurd jetzt eben erst drauf hingewiesen das es eine antwort im diesen thema gibt o:

Trotzdem viel dank :D

Edit:
Funktioniert einwandfrei :D ich weis nicht was der eine Typ da hat :D
01/05/2014 19:33 Kraizy​#62
Quote:
Originally Posted by BendiStyle View Post
Danke Kraizy ich wurd jetzt eben erst drauf hingewiesen das es eine antwort im diesen thema gibt o:

Trotzdem viel dank :D

Edit:
Funktioniert einwandfrei :D ich weis nicht was der eine Typ da hat :D
Kein Problem :)
01/22/2014 20:35 sterat#63
Hallo,

erst mal danke für das TUT - hat mir ein Stück weit geholfen. Hab da aber noch eine Frage.

Quote:
//da in Spy++ die 2. TextBox über der 1. ist, mache ich das hier genauso:
Dim TextBox2 As IntPtr = FindWindowEx(GroupBox, IntPtr.Zero, "WindowsForms10.EDIT.app.0.b7ab7b", Nothing)

Dim TextBox1 As IntPtr = FindWindowEx(GroupBox, TextBox2, "WindowsForms10.EDIT.app.0.b7ab7b", Nothing)
TextBox2 (fett) kann so nicht stimmen, da es nicht deklariert werden kann.

Und, was mache ich, wenn mir die Namen der Textboxen nicht bekannt sind, weil fremdes Tool? Diese müssen ja nicht immer TextBox1, TextBox2 oder TextBox3 heißen.
01/22/2014 22:32 Kraizy​#64
1. Wieso sollte es nicht deklariert werden können? Weil du wahrscheinlich schon eine TextBox namens TextBox2 auf deiner Form hast? Du kannst deine Variablen so benennen wie du lustig bist, es muss nicht TextBox2 heißen.

2. Genau das wird doch in diesem Tutorial erklärt..? Am besten liest dus dir nochmal in Ruhe durch.
01/24/2014 19:01 sterat#65
zu 1. Naja, wenn die zwei Formen in einem Projekt erstellt werden, dann geht's natürlich. Wenn aber 2 Projekte erstellt werden, dann nicht. Woher soll auch Projekt1"Form1" wissen wo in Projekt2"Form1" die Textfelder sind.

2. Hab's nochmals gelesen. Keine Ahnung wo das steht, was ich gefragt habe.
01/24/2014 20:20 Kraizy​#66
Sry versteh dein Problem nicht wirklich. Am besten erklärst dus nochmal ausführlich, vllt auch mit nem Bild oder so.
02/03/2014 19:59 sterat#67
Hallo Kraizy,

sorry für meine irreführenden Worte. Am besten ich fang mal von vorne an. :-)

Ich habe 2 Programme - genannt Sender und Empfänger.

Programm Sender soll sowohl Textfelder aus Programm Empfänger auslesen als auch Werte übergeben.

Leider schaffe ich es nicht, die Textfelder (Empfänger) zu identifizieren um sie richtig anzusteuern. Es wird ausschließlich das letzte Textfeld angesteuert.

Die Dateien kannst Du unter [Only registered and activated users can see links. Click Here To Register...] anschauen bzw. downloaden.
Benutzername: Gast@sterat - Passwort: bingast

Würde mich freuen, wenn Du mir hier weiter helfen könntest.

Beste Grüße
02/06/2014 20:18 sterat#68
Wollte mich mal wieder in Erinnerung bringen.
02/13/2014 18:45 sterat#69
Hallo Kraizy,

tja, scheint so, dass ich mit dem was ich anfangs gemeint habe recht zu haben oder warum höre ich jetzt nichts mehr von Dir? ;-)

Grüße
07/21/2014 19:30 Kraizy​#70
Quote:
Originally Posted by sterat View Post
Hallo Kraizy,

tja, scheint so, dass ich mit dem was ich anfangs gemeint habe recht zu haben oder warum höre ich jetzt nichts mehr von Dir? ;-)

Grüße
Tut mir leid, war ne längere Zeit ziemlich inaktiv hier. Falls du trotzdem nochmal auf diesen Thread stoßen solltest:

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

Wie du siehst ist in Spy++ deine untere TextBox über der oberen TextBox, also machst dus am besten ganz genauso:

PHP Code:
//Handles finden
Dim Hauptfenster As IntPtr FindWindow("WindowsForms10.Window.8.app.0.2bf8098_r13_ad1""Empfänger")
Dim UntereTextBox As IntPtr FindWindowEx(HauptfensterIntPtr.Zero"WindowsForms10.EDIT.app.0.2bf8098_r13_ad1"Nothing)
Dim ObereTextBox As IntPtr FindWindowEx(HauptfensterUntereTextBox"WindowsForms10.EDIT.app.0.2bf8098_r13_ad1"Nothing)
Dim BeendenButton As IntPtr FindWindowEx(HauptfensterIntPtr.Zero"WindowsForms10.BUTTON.app.0.2bf8098_r13_ad1""Beenden")

//Auslesen
MessageBox.Show(GetText(ObereTextBox))
MessageBox.Show(GetText(UntereTextBox))

//Setzen
SendMessage(ObereTextBoxWM_SETTEXT0"neuer Text für obere TextBox")
SendMessage(UntereTextBoxWM_SETTEXT0"neuer Text für untere TextBox")

//Button drücken
SendMessage(BeendenButtonBM_Click00
Bei mir funktioniert es damit völlig ohne Probleme.
07/27/2015 22:03 DexXxo#71
Hey hätte mal eine Frage,
wie bekomme ich aus Spielen bestimmte Textboxen oder wie kann ich einfach nur eine bestimmte taste an das Spiel senden ohne es auf haben zu müssen? :) Müsste doch eig möglich sein mit der SendMessage Methode? Nur ich glaube das "SETTEXT" hindert mich daran weil er ja nix ersetzen soll sondern einfach nur die bestimmte taste senden soll :) Wäre echt super wenn du mit helfen könntest.

PS: Es handelt sich um Nostale.

LG
07/27/2015 23:55 alpines#72
Das kommt auf das Spiel an, wird mit DirectX / OpenGL gearbeitet und es werden nicht die Standard Windows Controls genutzt kannst du das direkt vergessen. Dann musst du die TextBox erstmal anklicken und dann SendMessage nutzen.
10/04/2015 23:23 LauniSoft#73
Sehr gutes Tutorial. :handsdown:
11/09/2015 13:17 Kraizy​#74
Quote:
Originally Posted by DexXxo View Post
Hey hätte mal eine Frage,
wie bekomme ich aus Spielen bestimmte Textboxen oder wie kann ich einfach nur eine bestimmte taste an das Spiel senden ohne es auf haben zu müssen? :) Müsste doch eig möglich sein mit der SendMessage Methode? Nur ich glaube das "SETTEXT" hindert mich daran weil er ja nix ersetzen soll sondern einfach nur die bestimmte taste senden soll :) Wäre echt super wenn du mit helfen könntest.

PS: Es handelt sich um Nostale.

LG
Habe leider kein Nostale auf dem Rechner, nur Tera (welches auch von GameForge ist). Also die verschiedenen Textboxen und Buttons usw denke ich wirst du mit dieser Methode eher nicht finden. Jedoch habe ich kurz mal versucht, den Chat (durch die Enter Taste) zu öffnen, eine Nachricht zu schreiben und diese dann abzuschicken. Hat ohne Probleme funktioniert. Dazu habe ich jedoch nicht WM_SETTEXT benutzt, da ich dazu die Textbox für den Chat bräuchte (was ich jedoch nicht finden kann da es sich um ein Spiel handelt) sondern WM_KEYDOWN/UP & WM_CHAR:

PHP Code:
Const WM_KEYDOWN As Integer = &H100
Const WM_KEYUP As Integer = &H101
Const WM_CHAR As Integer = &H102 
PHP Code:
//Hauptfenster vom Spiel finden
Dim TeraClient As IntPtr FindWindow("LaunchUnrealUWindowsClient""TERA")

//Enter drücken um den Chat zu öffnen
SendMessage(TeraClientWM_KEYDOWNKeys.Enter0)
SendMessage(TeraClientWM_KEYUPKeys.Enter0)

//nicht unbedingt notwendig, aber wenn ich es weglasse
//passiert es abundzu, dass die Nachricht nicht ins Chatfenster eingefügt wird
Threading.Thread.Sleep(50)

//deine Nachricht
Dim nachricht As String "hallo"

//alle Zeichen durchgehen und senden
For Each c As Char in nachricht
     SendMessage
(TeraClientWM_CHARAsc(c), 0)
     
//hier könnte man evtl. auch Sleep einbauen, falls nicht alle Zeichen abgesendet werden
Next

//wieder nicht unbedingt notwendig, aber klappt zumindest bei mir so immer
Threading.Thread.Sleep(50)

//Enter drücken um die Nachricht abzuschicken
SendMessage(TeraClientWM_KEYDOWNKeys.Enter0)
SendMessage(TeraClientWM_KEYUPKeys.Enter0
Ob es eine elegantere Lösung statt WM_CHAR gibt weiß ich nicht, weil ich das mal schnell in 5min getestet habe und es hat wie gesagt ohne Probleme funktioniert. Ob du damit nun auch dein Inventar öffnen kannst (z.B. mit der I Taste) oder deinen Char nach vorne bewegen kannst mit W usw musst du einfach mal testen.

Quote:
Originally Posted by LauniSoft View Post
Sehr gutes Tutorial. :handsdown:
Danke :)