2012-10-15 5 views
13

Wie kann ich die Verwendung von ALT + F4 anwendungsweit für C# -Anwendungen deaktivieren?wie Alt + F4 für die Anwendung zu deaktivieren?

In meiner Anwendung habe ich viele WinForms und ich möchte mit ALT + F4, um die Fähigkeit des Schließens der Formen deaktivieren. Benutzer sollten jedoch in der Lage sein, das Formular mit "X" des Formulars zu schließen.

Auch dies ist nicht nur für eine Form. Ich bin auf der Suche nach einer Möglichkeit, so ALT + F4 ist für die gesamte Anwendung deaktiviert und wird für keine der Form funktionieren. Ist es möglich?

+13

Sie sollten sich eine Frage stellen - warum wollen Sie diese Standardmethode der Schließung Dialoge entfernen? Sie brechen die Konvention, und dazu müssen Sie einen guten Grund haben - sehen Sie sich den Austausch der Benutzererfahrungen an. – Ian

+4

Wow, das mögliche Duplikat war genau für die Person, die es beantwortete und dann plötzlich löschte. Schattig! – JonH

+7

Wow und dann editieren zu: 'Ich würde empfehlen, folgendes zu tun:', @Daniel bitte hör auf zu kopieren und Einfügen von Antworten von anderen während der Kreditaufnahme. Markieren Sie die Frage als Duplikat geschlossen und finden Sie bessere Dinge, die mit Ihrer Zeit zu tun haben. – JonH

Antwort

4

Man könnte so etwas wie dies in der Hauptstartmethode setzen:

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.AddMessageFilter(new AltF4Filter()); // Add a message filter 
      Application.Run(new Form1()); 
     } 
    } 

    public class AltF4Filter : IMessageFilter 
    { 
     public bool PreFilterMessage(ref Message m) 
     { 
      const int WM_SYSKEYDOWN = 0x0104; 
      if (m.Msg == WM_SYSKEYDOWN) 
      { 
       bool alt = ((int)m.LParam & 0x20000000) != 0; 
       if (alt && (m.WParam == new IntPtr((int)Keys.F4))) 
       return true; // eat it!     
      } 
      return false; 
     } 
    } 
} 
+1

Das ist eine interessante Lösung. Was ist, wenn die Nachricht zu spät verarbeitet wird (aufgrund einer Verzögerung) und "Control.ModifierKeys" nicht mehr meldet, dass "Strg" gedrückt wird (verpasst)? –

+0

danke für die Lösung. Ich war auf der Suche nach so etwas. Neben alt + F4 wird auch alt + shift + F4 herausgefiltert. Nur um es dich wissen zu lassen. – mchicago

+1

@AllonGuralnek - Hmm ... Ich sehe, wir haben ein wählerisches Publikum :-) Ich habe meine Antwort aktualisiert, um lParam's 29. Bit anstelle von Control.ModifierKeys zu verwenden. –

Verwandte Themen