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
Fenster automatisch schließen wenn inaktiv
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4.207
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

Fenster automatisch schließen wenn inaktiv

beantworten | zitieren | melden

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

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von xxxprod am .
private Nachricht | Beiträge des Benutzers
Golo Roden
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4.207
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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
myCSharp.de - Member

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4.207
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

beantworten | zitieren | melden

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

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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

Avatar #avatar-2167.png


Dabei seit:
Beiträge: 4.207
Herkunft: Riegel am Kaiserstuhl

Themenstarter:

beantworten | zitieren | melden

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

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

Ok vielleicht war ich gerade etwas vorlaut

Was bedeutet
Zitat
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
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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.
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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)
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

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^^
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

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.
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

ja, das verhindert ja seine bedingung das er keine kontrolle über die childs hat.
xxxprod
myCSharp.de - Experte

Avatar #avatar-2329.gif


Dabei seit:
Beiträge: 1.378
Herkunft: Österreich\Wien

beantworten | zitieren | melden

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