2012-10-15 25 views
13

Jak można wyłączyć używanie aplikacji dla aplikacji C#?jak wyłączyć Alt + F4 dla aplikacji?

W mojej aplikacji, mam wiele WinForms i chcę wyłączyć możliwość zamykania formy korzystania alt + F4. Użytkownicy powinni mieć możliwość zamknięcia formularza za pomocą "X" formularza.

Znowu nie jest to tylko dla jednego formularza. Szukam sposobu, aby wyłączyć dla całej aplikacji i nie będzie działać dla żadnej z postaci. Czy to możliwe?

+13

należy zadać sobie pytanie - dlaczego chcesz usunąć ten standardowy sposób zamykania okien dialogowych? Łamiesz konwencję, a zrobienie tego wymaga bardzo dobrego powodu - sprawdź wymianę stosu użytkowników. – Ian

+4

Wow możliwy duplikat był dokładny dla osoby, która odpowiedziała, a następnie nagle go usunął. Zacieniony! – JonH

+7

Wow, a następnie edytując go do: 'Zalecam wykonanie następujących czynności:', @Daniel, przestań kopiować i wklejaj odpowiedzi od innych, jednocześnie biorąc kredyt. Oznacz pytanie zamknięte jako duplikat i znajdź lepsze rzeczy związane z czasem. – JonH

Odpowiedz

4

Można umieścić coś takiego w głównej metody uruchamiania:

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

To interesujące rozwiązanie. Co jeśli komunikat jest przetwarzany z opóźnieniem (z powodu opóźnienia) i 'Control.ModifierKeys' nie zgłasza, że' Ctrl' jest wciśnięty (pominięty)? –

+0

dzięki za rozwiązanie. Szukałem czegoś takiego. Przy okazji razem z alt + F4, odfiltrowuje również alt + shift + F4. Dla Twojej wiadomości. – mchicago

+1

@AllonGuralnek - Hmm ... Widzę, że mamy wybredną publiczność :-) Zaktualizowałem swoją odpowiedź, aby użyć 29. bitowego lParam zamiast Control.ModifierKeys. –

Powiązane problemy