2016-05-30 7 views
-1

Ich brauche ein modales Formular, um den Benutzer zu benachrichtigen (zB durch Schütteln), wenn der Benutzer versucht, auf eine andere Form der Anwendung zuzugreifen (per Mausklick oder sonstwie)). Das Problem ist, dass ich diesen Versuch nicht erkennen kann. Events/Deactivate, LostFocus, Leave/funktioniert einfach nicht. HINZUFÜGEN: das modale Formular ist randlos, wenn also ein Benutzer auf das übergeordnete Formular klickt (das deaktiviert ist, wenn das modale Formular geöffnet ist) - NOTHING passiert. Die Form hat keinen Rand, also blinkt sie nicht. Deshalb brauche ich eine Möglichkeit, um den Benutzer zu benachrichtigen, dass er das modale Formular schließen muss, um auf das übergeordnete Formular zuzugreifen. Ich beschloss, das modale Formular zu schütteln, um den Benutzer darauf aufmerksam zu machen. Aber dafür muss ich das Ereignis abfangen, wenn der Benutzer versucht, auf das übergeordnete Formular zuzugreifen. Ich weiß nicht, wie ich das machen soll.C# - So erkennen Sie den Versuch des Benutzers, den Fokus von einem modalen Formular zu entfernen

+1

Und mit ['.ShowDialog()'] (https://msdn.microsoft.com/en-us/library/c7ykbedk (v = vs.110) .aspx), die diese Funktionalität hat, ist kein Möglichkeit? – TEK

+0

Ich weiß, wie man eine Form modal macht (ich benutze ShowDialog). Das Problem besteht darin, programmgesteuert herauszufinden, dass der Benutzer versucht, auf das übergeordnete Formular zuzugreifen, wenn das modale Formular geöffnet ist. –

+0

Dann müssen Sie dies explizit in der Frage machen, da es im Moment mehrdeutig ist. – TEK

Antwort

0

Verwenden Form.ShowDialog() statt Form.Show()

ShowDialog zeigt das Fenster als modal, was bedeutet, dass Sie nicht mit dem übergeordneten Formular interagieren kann, bis es geschlossen wird.

Und Sie können übergeordnete Formular

this.Enabled = false; 
MyChildForm childForm = new MyChildForm(); 
childForm.ShowDialog(this); 
+0

Ich weiß, wie man es modal macht. Aber das ist nicht mein Problem. Bitte lesen Sie das Thema. –

+1

@AlexD. Lesen Sie Ihre Frage: _ "Ich brauche ein modales Formular, um den Benutzer zu benachrichtigen (z. B. durch Schütteln), wenn der Benutzer versucht, auf eine andere Form der Anwendung zuzugreifen (per Mausklick oder auf irgendeine andere Weise)" _. Also ist dieser Teil eigentlich völlig irrelevant? Ihre Frage lautet: "Wie kann ich erkennen, wenn auf ein modales Formular nicht geklickt wurde?" – TEK

+0

Ich habe die Frage bearbeitet. Englisch ist nicht meine Muttersprache, tut mir leid, wenn Sie es nicht verstehen konnten ( –

0

Sie könnten Hacky etwas einiges deaktivieren:

Zum einen eine boolean-Eigenschaft auf Ihre Hauptformular hinzufügen (die eine, die Sie blinken wollen, nicht die modale Form), so dass Sie können, ob die modal verfolgen Form dargestellt:

bool inModalForm; 

void button1_Click(object sender, EventArgs e) 
{ 
    using (var form = new Form2()) 
    { 
     this.BeginInvoke(new Action(() => inModalForm = true)); 
     form.ShowDialog(); 
     inModalForm = false; 
    } 
} 

den booleschen Set mit BeginInvoke(), weil Sie eine Fensternachricht über das Hauptfenster des po bekommen Nach inModalForm wird die Einstellung geändert, die Sie nicht möchten.

außer Kraft setzen Dann WndProc() in der Hauptform wie folgt:

protected override void WndProc(ref Message m) 
{ 
    const int WM_WINDOWPOSCHANGING = 0x46; 

    if (inModalForm && (m.Msg == WM_WINDOWPOSCHANGING)) 
    { 
     Debug.WriteLine("Someone's trying to activate the window."); 
    } 

    base.WndProc(ref m); 
} 

Machen Sie Ihre Fenster Blitz, wo ich die Debug.WriteLine setzen(). Ich denke, Sie müssen this.BeginInvoke() verwenden, um Ihre Flash-Methode aufzurufen; du willst es nicht von innen machen WndProc()!

Dies ist nicht perfekt, weil ich denke, dass Sie gelegentlich eine falsche Nachricht erhalten können (wenn zum Beispiel keine Form den Fokus hat und Sie dann auf die modale Form klicken), aber vielleicht wird es tun.

Verwandte Themen