Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Textchanged event einer Textbox, die aus einem IntPtr erzeugt wird
STF-DIR
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

Textchanged event einer Textbox, die aus einem IntPtr erzeugt wird

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
STF-DIR
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

..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
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 790

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
STF-DIR
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Cat
myCSharp.de - Member

Avatar #avatar-3070.jpg


Dabei seit:
Beiträge: 790

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
STF-DIR
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

Hallo,

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

Danke noch mal
Matthias
private Nachricht | Beiträge des Benutzers
Mallett
myCSharp.de - Member



Dabei seit:
Beiträge: 176

beantworten | zitieren | melden

Hallo STF-DIR

schau Dir mal den System.Windows.Automation namespace an. Das dürfte Dir evtl. weiter helfen.
private Nachricht | Beiträge des Benutzers
CoLo
myCSharp.de - Member



Dabei seit:
Beiträge: 232

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Lenny
myCSharp.de - Member



Dabei seit:
Beiträge: 95

beantworten | zitieren | melden

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 ?
private Nachricht | Beiträge des Benutzers
CoLo
myCSharp.de - Member



Dabei seit:
Beiträge: 232

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
STF-DIR
myCSharp.de - Member



Dabei seit:
Beiträge: 366

Themenstarter:

beantworten | zitieren | melden

Zitat von Lenny
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
private Nachricht | Beiträge des Benutzers