hauptform modal machen und verhindern, dass ein steuerelement den fokus bekommen kann
-
ich möchte das hauptform der anwendung modal machen, d. h. der anwender soll zuerst das hauptform "bearbeiten" und erst dann mit dem rest von windows weiterarbeiten können. bei dialogen geht das ja mit ShowDialog().
des weiteren möchte ich vermeiden, dass ein bestimmtes steuerelement den fokus bekommen kann.
wie geht das?
-
CSharpNewbie schrieb:
ich möchte das hauptform der anwendung modal machen, d. h. der anwender soll zuerst das hauptform "bearbeiten" und erst dann mit dem rest von windows weiterarbeiten können. bei dialogen geht das ja mit ShowDialog().
Eine Form *ist* ein Dialog. Du kannst es also ganz gewöhnlich über 'ShowDialog' machen.
-
CSharpNewbie schrieb:
ich möchte das hauptform der anwendung modal machen, d. h. der anwender soll zuerst das hauptform "bearbeiten" und erst dann mit dem rest von windows weiterarbeiten können.
Was meinst du mit dem Rest von Windows? Aus der Hauptform heraus startet man doch in der Regel die anderen Fenster, wenn du nicht willst das er zu anderen Fenster wechselst, dann zeig die halt nicht an. Oder meinst du gar Windows als Betriebsystem? Das ist unter keinen Umständen möglich den User abzuhalten das OS zu nutzen.
-
Konrad Rudolph schrieb:
Eine Form *ist* ein Dialog. Du kannst es also ganz gewöhnlich über 'ShowDialog' machen.
ja, das ist mir klar, aber es geht um das hauptfenster, das im hauptprogramm folgendermaßen aufgerufen wird (das ist jetzt automatisch generierter code):
static class Program { /// <summary> /// Der Haupteinstiegspunkt für die Anwendung. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MyForm()); } }
wo soll ich denn da showdialog aufrufen, ich habs schon so probiert, funktioniert aber nicht:
static class Program { /// <summary> /// Der Haupteinstiegspunkt für die Anwendung. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); MyForm myForm = new MyForm(); Application.Run(myForm); myForm.ShowDialog(); } }
das form wird hier zwar angezeigt, aber es ist nicht modal, und einige sekunden nach schließen des programs meckert vcs, dass ein fehler aufgetreten ist, der nach redmond gesendet werden soll.
-
@Talla: es gibt doch so anwendungen, die sind imer aktiv. bei installationsroutinen ist es zum beispiel oft so. wenn du auf eine stelle außerhalb der anwendung klickst, passiert nichts. du musst erst innerhalb der routine auf abbrechen oder fertigstellen klicken, bevor u mit windows weiterarbeiten kannst. das meinte ich.
-
die 2. frage habe ich geklärt (eigenschaft TabStop des steuerelements).
-
Ich versteh dein Problem noch nicht ganz.
Ob nun Modal oder nicht Modal bezieht sich ja immer auf ein Parent-Child Form Verhältnis. Eine Childform kann bezüglich der Parentform modal oder halt nicht modal sein.
Die Hauptform hat aber gar keine übergeordnete Form, bezüglich was soll sie sich modal verhalten?
Application.Run(myForm); myForm.ShowDialog();
macht keinen Sinn und muss zwangsläufig zu Fehlern führen, da Run die Form mit Show öffnet, die dann irgendwann geschlossen wird vom User, und wenn du dann mit deinem ShowDialog kommst dann ist die Form schon längst zerstört und kann gar nimmer angezeigt werden.
@fehlermeldung
Windowstaste + D -> mit der Tastenkombi bringst du auch solche Programme in den Hintergrund
-
modal bezüglich des desktops!! das hauptform IST doch sozusagen ein "childform" des desktops.
-
Wie kommst du drauf? Nur weil den Fenster oberhalb vom Desktop erscheint, ist es noch lange kein Child des Desktops. Das fängt schon an dass der Desktop erstmal überhaupt kein Fenster im Sinne der Windows Fenster ist und hört damit auf dass das ganze modale Zeugs sich eh nur auf Fenster eines Prozesses bezieht, und deine Anwendung läuft ganz sicherlich nicht im Prozess des Explorers der den Desktop anzeigt. Dein Problem mit irgendwelchen Modalitäten von Fenstern zu lösen ist nicht möglich.
-
Jede Form hat die Eigenschaft TopMost.
Brauchst nur auf True zu setzen wenn ich dein Problem richtig verstanden habe.
.
-
Ich glaube hier liegt ein Verständnisproblem des OP vor: Auch Setuproutinen blockieren Windows nicht, ich kann immer mit Alt-Tab o.ä. wechseln. Vielleicht überdeckt die Setup-Routine den Desktop vollständig mit einem Hintergrundbild, so dass auch die Startleiste unsichtbar ist, das hält aber höchstens irgendwelche DAUs ab.
-
also, jetzt nochmal weg vom beispiel der setup-routine und gaanz langsam:
der anwender startet mein programm. nun soll er sich darum kümmern und irgendwelche benutzereingaben machen. wenn er irgendwohin außerhalb des fensters klickt, wird es NICHT inaktiv, sondern bleibt aktiv, sodass der benutzer es erst schließen muss, bevor er etwas anderes machen kann. es soll sich also wie ein modaler dialog verhalten.
@unix-tom: nein du hast es falsch verstanden. das form soll nicht über allen anderen fenstern angezeigt werden - es soll immer aktiv sein.
und @lord jaxom: das mit der setup routine war jetzt ein dummes beispiel. s.o.