Laden...

Fenster automatisch schließen wenn inaktiv

Erstellt von Golo Roden vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.163 Views
Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren
Fenster automatisch schließen wenn inaktiv

Hallo,

mir fehlt gerade der Ansatz zur Lösung eines Problems - vielleicht hat ja jemand von Euch einen Tipp.

Es geht um folgendes: Aus einer Anwendung heraus lässt sich ein bestimmtes Fenster öffnen. Dieses Fenster soll so lange offen bleiben, bis der Benutzer es verlässt - sei es durch Mausklick oder durch die Tastatur.

So weit ist das auch nicht schwer, lässt sich mit OnDeactivate gut hinbekommen.

Nun soll das Fenster aber NICHT geschlossen werden, wenn ein Dialog aufgeht, der durch dieses Fenster initiiert wurde - sprich, der Wechsel zu sonstwohin soll das Fenster schließen, der Wechsel zu einem Childwindow aber nicht.

Wie würde man an dieses Problem rangehen?

Viele Grüße,

Golo

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

1.378 Beiträge seit 2006
vor 15 Jahren

Knifflige Aufgabe. Hab sowas auch schon mal in einer anderen Situation umsetzen müssen. Das Problem ist, dass Deactivate oder Leave Ereignisse vor Enter Ereignissen eintreten. Somit kann man zum Leave Zeitpunkt nicht abfragen, ob ein Child-Fenster bereits den Fokus hat. Ich würde einfach einen Timer mit ein paar Millisekunden dazwischen schalten und im Elapsed Event prüfen ob eines der Child-Fenster gerade den Focus hat. Wenn ja dann bleibt man visible und wenn nein dann nicht.

Lg XXX

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

Danke erst einmal für die Antwort ... das blöde ist: Wie ermittle ich, ob ein Childwindow aktiv ist?

Im Prinzip möchte ich ALLE Fenster haben, die direkt oder indirekt aus diesem Fenster heraus geöffnet wurden - also beispielsweise auch ein FileOpen-Dialog, und daraus ein per Kontextmenü aufgerufenes Fenster ...

Geht das überhaupt?

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

Gelöschter Account
vor 15 Jahren

wie wäre es wenn sich beim öffnen eines childfenster die ensprechende methode die ondeactivate behandelt, sich beim "parent" form austrägt und beim childform einträgt? sowas könnte man mithilfe einer basisklasse recht einfach vordefinieren. dann müsste man beim öffnen einer schildform nur noch z.b. eine methode aufrufen.

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

Hallo,

das Problem ist, dass ich auf die Childwindows keinen Einfluss habe. Vielleicht ist Childwindow auch der falsche Begriff.

Wenn zB per Process.Start ein externes Programm aus diesem Fenster heraus gestartet wird, soll auch das als "Childwindow" zählen ...

Viele Grüße,

Golo

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

1.378 Beiträge seit 2006
vor 15 Jahren

Ich kann mir vorstellen das dies über Windows Messages funktioniert. Leider hab ich auf diesem Gebiet nur sehr wenig Erfahrung.

Würde es ausschließlich um Windows-Forms Fenster gehen, wärs überhaupt kein Problem :S

Lg XXX

Golo Roden Themenstarter:in
4.207 Beiträge seit 2003
vor 15 Jahren

Hmmm, dann mal rein aus Neugier - wie würde man das Problem denn rein mit Windows Forms lösen, wenn man keinen Einfluss auf die Basisklasse oder die anderen Fenster hätte?

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

1.378 Beiträge seit 2006
vor 15 Jahren

Ok vielleicht war ich gerade etwas vorlaut 😜

Was bedeutet

wenn man keinen Einfluss auf die Basisklasse oder die anderen Fenster hätte ?

Es müssten schon alle Windows die ChildWindows sein könnten um Funktionen erweitert werden, sodass das Parent-Form diese Prüfen kann(rekursiv) ob eines der Formulare oder subformulare den Focus hat.

Ohne den Code der Clientformular angreifen zu können würd mir auch keine Lösung dazu einfallen 🙁

Lg XXX

Gelöschter Account
vor 15 Jahren

rekursives durchhangeln durch alle childforms. bei dialogen allerdings wird es schwer.... da könnte ich mir vorstellen, das ma nevtl duch api calls das aktive windowhandle holt und dort fragt ob das teil ein parent hat und wenn ja dann wen.

aber wenn man einen prozess startet.. dann wird es schwer.

1.378 Beiträge seit 2006
vor 15 Jahren

Aja fürs rekursive prüfen müsste man die Child-Forms nicht anpassen. Aber wenn sie sich merken könnten welche Child-Windows sie haben bzw. welche gerade geöffnet sind (zB List<Form>) dann könnte man bequem durch iterieren. Bringt aber auch nix, wenn die Child-Forms wieder externe(Win32) apps aufrufen können.

Lg XX

Gelöschter Account
vor 15 Jahren

im prinzip müüste man durch alle childforms rekursiv durchiterieren und wenn alle keinen fokus haben, dann muss man isch das handle vom aktiven window holen und irgendwie sich den dazugehörigen prozess holen. dann gibt es vielleicht eine möglichkeit herauszufinden, wer den prozess besitzt oder die prozessid, die diesen prozess erzeugt hat?

(letzter satz ist eine vage vermutung)

C
401 Beiträge seit 2007
vor 15 Jahren

Soll denn das Fenster da bleiben, solange das "Childwindow" offen ist, oder soll sich das auch schließen, wenn der Fokus verloren geht? Wenn dem nicht so ist könntest du doch einfach beim öffnen eines solchen "Childwindow" eine Prüfvariable setzen und die halt beim verlust des Fokus abfragen, bevor du die Form schließt. Vielleicht denke ich aber auch gerade viel zu einfach^^

Gelöschter Account
vor 15 Jahren

das problem ist ja wenn z.b. ein childwindow in sagenwirmal 3. hierarchietiefe einen prozess startet, das auch ein win32 window erzeugt, dann hat man eigendlich keine möglichkeit zu erfahren, ob die aktuelle anwendung der owner diese prozesses und damit auch dieses windows ist.

man könnte es, wenn das childwindow diesen prozess an einer zentralen stelle z.b. eintragen würde.

C
401 Beiträge seit 2007
vor 15 Jahren

Dann bau doch ne Prozessliste in deine Childwindows ein. Bei einem Process Objekt kannst du ja abfragen HasExited abfragen, um festzustellen, ob der Prozess noch läuft, oder du löscht den Prozess beim Exited Event.

Gelöschter Account
vor 15 Jahren

ja, das verhindert ja seine bedingung das er keine kontrolle über die childs hat.

1.378 Beiträge seit 2006
vor 15 Jahren

Was mich dazu noch interessieren würde ist, wie das verhalten bei childwindows eigentlich sein soll.

Wenn dein parent-window den focus verliert kann es sich ja schließen - schön und gut. Aber wenn ein child-window den focus verliert soll es sich auch beenden? und alle child windows dazu vielleicht? Denke nicht das dies ein sehr intuitives verhalten ist.

So wie ich das verstehe würde es doch reichen, wenn man das autohide deaktiviert sobal irgendein child-window aufgerufen wird. Und solange eines noch offen ist, bleibt der AutoHide Mechanismus deaktiviert. Erst wenn das letzte Window geschlossen ist wird der Mechanismus wieder aktiviert und sofort überprüft, ob das parent-window focus hat oder nicht.

Lg XXX