Laden...

Windows Form über externer textbox platzieren

Erstellt von lot2learn vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.541 Views
L
lot2learn Themenstarter:in
43 Beiträge seit 2013
vor 10 Jahren
Windows Form über externer textbox platzieren

Hallo zusammen,

ich versuche momentan eine Windows Form über eine Textbox einer externen Anwendung zu setzen. Dazu mache ich folgendes:


public static int GWL_STYLE = -16;
public static int WS_CHILD = 0x40000000; 

[DllImport("user32", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern IntPtr SetParent(IntPtr HWNDChild, IntPtr HWNDNewParent);

[DllImport("user32.dll")]
public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);

internal static void AttachWindow(IntPtr targetTextBoxHandle)
{
    SetWindowLong(this.Handle, GWL_STYLE, GetWindowLong(this.Handle, GWL_STYLE) | WS_CHILD);
    SetParent(this.Handle, targetTextBoxHandle);
}

Das funktioniert soweit auch, allerdings gibt es mehrere Probleme:

  1. Das Fenster der Form wird nicht immer vollständig gezeichnet, teilweise sind "Lücken" zwischen der Grafik so dass man das dahinter liegende Textfenster teilweise sehen kann.
  2. Das erste Problem tritt vor allem auf wenn ich Text an die darunterliegende Textbox sende (per SendMessage). Auch ein this.Refresh() hilft dann komischweise nicht.
  3. Die externe Zielanwendung friert des öfteren mal ein wenn ich mein Programm stoppe oder das Fenster der externen Andwendung schließe, wofür ich keine rechte Erklärung habe. Windows meckert dann rum "Das Programm XY funktioniert nicht mehr".

Hat jemand Erfahrung mit sowas? Leider kann ich keine Fehlermeldungen posten, da die Zielanwendung einfach einfriert.

Schöne Grüße,
l2l

I
16 Beiträge seit 2012
vor 10 Jahren

Hallo.

Ich habe jetzt nicht viel gelesen, nur das mit den Lücken.
Hast du schon mal probiert, dass du der Form ".BringToFront()" mitgibst?

Lg

L
lot2learn Themenstarter:in
43 Beiträge seit 2013
vor 10 Jahren

Hallo,

naja so lang ist der text ja auch nicht^^
BringToFront hab ich schon probiert, das bringt leider nichts.

Die Abstürze sind mittlerweile übrigens verschwunden... hab den Code eigentlich nur ein bisschen umstrukturiert und seitdem ist das Program komischerweise nicht mehr abgeschmiert.

Mich würde aber vor allem auch noch was anderes in diesem Zusammenhang interessieren:

Ich will ja eigentlich meine Textbox in die externe Anwendung injizieren - dadurch verliert diese aber den Bezug zu meiner Form, in der aber ja der Ganze Code liegt den ich auch mit drin haben will.

Wenn ich aber nicht die Textbox sondern die Ganze Form als neues Child zuweise, hab ich zwei Forms "übereinander", also wenn ich die eine Anklicke verliert die andere den Focus. Gibt es eine Möglichkeit nur die Textbox als neues Child einzufügen und trotzdem noch mit dem Code der in meiner Form ist zu assoziieren?

Schöne Grüße,
l2l

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo lot2learn,

kannst du uns verraten warum du das angestrebte Verhalten erreichen willst?

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
lot2learn Themenstarter:in
43 Beiträge seit 2013
vor 10 Jahren

Hallo,

ja klar. Es soll einfach die Funktionalität eines bestehenden Programms erweitert werden. Dazu sollen neue Elemente (wie etwa die von mir verwendete Scintilla Textbox) in diverse Menüs/Forms der ursprünglichen Application eingefügt werden.

Ziel ist es, die mittlerweile sehr in die Jahre gekommene und altbackene Anwendung etwas zu modernisieren, um den Arbeitskomfort zu erhöhen.

Schöne Grüße,
l2l

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo lot2learn,

besteht nicht die Möglichkeit die alte Anwendung direkt anzupassen? Das wäre wohl der einfachere und auch robustere Weg.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
lot2learn Themenstarter:in
43 Beiträge seit 2013
vor 10 Jahren

Nein, leider nicht.

Die Anwendung ist als Code nicht verfügbar und wird auch nicht weiter supported in der Richtung. Daher der Ganze Aufwand. Dass mein Anliegen zumindest prinzipiell möglich seien muss zeigen einige inoffizielle Erweiterungen die ähnliches machen wie das was ich vorhabe. Diese Erweiterungen sind mittlerweile aber auch nicht mehr zeitgemäß (auch schon über 5 Jahre alt).

Momentan würde mich daher am meisten interessieren ob/wie man zwei Forms so "verschmelzen" kann wie oben beschrieben. Weißt du diesbezüglich etwas?

Schöne Grüße,
l2l

L
lot2learn Themenstarter:in
43 Beiträge seit 2013
vor 10 Jahren

Weiß denn keiner etwas zu diesem Thema? Oder ist die Frage nicht detailiert genug gestellt? Hab das Problem trotz intensiver Bemühungen leider immer noch nicht gelöst bekommen...

A
52 Beiträge seit 2011
vor 10 Jahren

Wenn cih das richtig sehe möchtest du direkt auf die Form zugreifen und eine arte neue textbox hinzufügen bzw die vorhandene ersetzen durch eine eigene.

Die Variablen dieser Textbox werden durch deinen Mod berechnet ist das soweit richtig?

Gruß Alexander Schill

L
lot2learn Themenstarter:in
43 Beiträge seit 2013
vor 10 Jahren

Hallo,

ja, genau so hab ich mir das vorgestellt. Es soll quasi die Textbox der externen Anwendung "ersetzt" werden durch eine eigene (das Ersetzen wäre natürlich nur simuliert, da die Textbox ja nur über der alten platziert werden würde, daher die Anführungszeichen).

Dadurch soll die Zielanwendung erweitert und modernisiert werden. Kannst du mir diesbezüglich Tipps geben?

Schöne Grüße,
l2l