Laden...

Textchanged event einer Textbox, die aus einem IntPtr erzeugt wird

Erstellt von STF-DIR vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.734 Views
S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 9 Jahren
Textchanged event einer Textbox, die aus einem IntPtr erzeugt wird

Hallo,

ich habe einen IntPtr von einer anderen App und finde daraus auch den IntPtr auf eine Textbox. Mit dem Intptr kann ich in die Textbox scheiben. Das funktioniert.
Ich muss aber auf eine Änderung in der Textbox des anderen Fenster reagieren.
Leider funktioniert das nicht so ganz.


List<IntPtr> pControls = new List<IntPtr>();
IntPtr handleparent = FindWindow(null, "TestFensterName");			
pControls = IVAP.GetChildWindows(handleparent);

extTextBox = pControls[5]; // das ist die Textbox um die es geht

Nun hab ich versucht ein event zu erstellen:


((TextBox)(extTextBox as Control)).TextChanged += onTextChanged;
			
((TextBox)extTextBox).TextChanged += onTextChanged;

Ich hab beide Varianten ausprobiert.
Leider kann man einen IntPtr nicht einfach so als ein TextBox verwenden.

Könnt ih mir da einen Tip geben?

Danke
Matthias

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 9 Jahren

..ich hab noch weiter getestet:


			const int WM_SETTEXT = 0x0C;
			
			List<IntPtr> pControls = new List<IntPtr>();
			IntPtr handleparent = FindWindow(null, "FMC-TALKER v0.2b9");
			
			pControls = IVAP.GetChildWindows(handleparent);
			extTextBox = pControls[5];
			
			SendMessage(extTextBox, WM_SETTEXT,0, "txt");
			
			Control focusedControl = Control.FromHandle(handleparent);

Sendmessage funktioniert tadellos, aber egal was ich mache, ich hab keine Ahnung wie ich ein event auf die externe Textbox erstellen kann?
Control.FromHandle funktioniert weder mit dem handleParen noch mit dem Handle extTextbox.
Beide sind definitiv korrekt und nicht null.
Ich bekomme aber immer eine ArgumentNull Exception.

Matthias

771 Beiträge seit 2009
vor 9 Jahren

Hi,

das kann und wird so nicht funktionieren - die Events funktionieren nur in deinem eigenen .NET-Programm (selbst wenn das andere auch ein .NET Programm ist - solange du nur per WinAPI (IntPtr) darauf zugreifst -> unmöglich).

Das einfachste wird wohl sein auf eine Änderung zu pollen, d.h. du fragst in einem Timer immer wieder per GetWindowText die TextBox ab und prüfst selber auf eine Änderung des Textes.

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 9 Jahren

Hallo,

ahh, ok danke Dir .. genau das wollte ich zwar verhindern, aber wenns nicht anders geht is es halt so.

Trotzdem würde mich noch interessieren wie ich von dem Intpointer auf die Textbox direkt zugreifen kann, also ohne SendMessage ?

Also warum dieses beides nicht geht?


((TextBox)(extTextBox as Control)).Text;

((TextBox)extTextBox).Text; 

Da bekomme ich immer eine Fehlermeldung das der Pointer wohl NULL wäre.
Aber warum geht denn das hier dann ?


SendMessage(extTextBox, WM_SETTEXT,0, "txt");


Da nehm ich doch den gleichen IntPtr ( extTextBox )

Matthias

771 Beiträge seit 2009
vor 9 Jahren

Du kannst doch nicht einfach einen IntPtr in ein Control casten. Mittels 'as' kommt dann halt null raus und beim direkten Cast eine "InvalidCastException".

Und SendMessage ist eine WinAPI-Funktion, welche die Message in die MessageQueue packt, und das andere Programm dann entsprechend in seiner MessageLoop (WND_PROC) die Nachricht auswertet. Dieses TextBox-Control ist intern ein in C (bzw. C++) geschriebenes Control der WinAPI (User32.dll), d.h. da kannst du nur per WinAPI-Funktionen darauf zugreifen.

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 9 Jahren

Hallo,

ok, das hab ich dann wohl durcheinander gewürfelt.

Danke noch mal
Matthias

M
171 Beiträge seit 2012
vor 9 Jahren

Hallo STF-DIR

schau Dir mal den System.Windows.Automation namespace an. Das dürfte Dir evtl. weiter helfen.

C
224 Beiträge seit 2009
vor 9 Jahren

Alternativ: falls das fremde Programm auch von Dir ist, kann Dein fremdes Programm ja per Send-/PostMessage Usermessages versenden und Dein eigenes Programm kann darauf reagieren.

L
95 Beiträge seit 2009
vor 9 Jahren

Ich möchte mich an dieser Stelle mal einklinken aus reiner Wissbegierde.
Sofern ich das richtig verstanden habe ist es doch möglich einen Pointer auf ein bestimmtes Benutzerelement eines anderen Programms zu erhalten (das in .Net) geschrieben wurde.
Sofern ich weiß wird auch in .Net ein Objekt an einer bestimmte Stelle im Speicher abgelegt auf die ich mit einem Pointer zugreifen kann.
Warum ist es dann also nicht möglich den erhaltenen Pointer in eine Textbox (o.Ä) zu casten ?

C
224 Beiträge seit 2009
vor 9 Jahren

Falls es möglich ist, der Speicherschutz spricht gegen die Verwendung. Es ist auch nicht besonders objektorientiert auf den privaten Anwendungsbereich, wo die Textbox sich befindet, von außerhalb per Pointer zuzugreifen.

S
STF-DIR Themenstarter:in
368 Beiträge seit 2006
vor 9 Jahren

Ich möchte mich an dieser Stelle mal einklinken aus reiner Wissbegierde.
Sofern ich das richtig verstanden habe ist es doch möglich einen Pointer auf ein bestimmtes Benutzerelement eines anderen Programms zu erhalten (das in .Net) geschrieben wurde.
Sofern ich weiß wird auch in .Net ein Objekt an einer bestimmte Stelle im Speicher abgelegt auf die ich mit einem Pointer zugreifen kann.
Warum ist es dann also nicht möglich den erhaltenen Pointer in eine Textbox (o.Ä) zu casten ?

Hallo

dank euch allen für die Antworten...war ein bisschen im Stress und konnte mich erst jetzt wieder melden.

@Lenny: Das war ja auch mein Denkansatz, der aber anscheinend nicht funktioniert. Auch wenn das nicht besonders Objektorientiert ist sollte es dennoch funktionieren dachte ich zumindest.
Schade das nicht 😦

Das andere Programm ist leider nicht meins und deshalb kann ich von dort auch nix senden.
Ok, ich könnte jetzt einen Timer nehmen und alle paar Sekunden die externe Textbox abfragen.
Das ist aber auch keine besonders effektive Lösung denke ich.

Ich werd mir mal den Automation Namespace anschauen, vielleicht finde isch ja dort etwas.

Danke Euch nochmals
Mtthias