deaktywacja zamykania okna dialogowego kombinacją Alt-F4

0

Witam
Mam problem. Z głównego okna programu po kliknięciu na jakąś opcję wywołuje inne okno (innego Forma, dla ścisłości).
Robię to z użyciem ShowDialog(); Nowo otwarte okienko ma m.in. takie ustawienia:

  • wyłączam ControlBoxa (czyli nie ma przycisków: minimalizuj, maksymalizuj oraz zamknij na pasku): ControlBox = false
  • styl okna ustawiam na FixedSingle: FormBorderStyle = FixedSingle

Do tej pory ok, wszystko pięknie ładnie, wstawiłem buttona, który zamyka dane okienko. Teoretycznie, gdy nie ma przycisku zamknij na górnej belce (górnym pasku), i nie doda się żadnego buttona wywołującego funkcję Close(), a także okienko jest okienkiem dialogowym (na pasku zadań nie widać) takiego okna nie powinno się było dać zamknąć, a jednak kombinacja klawiszy Alt-F4 je zamyka. I z tym mam problem, bo nie powinna.

1

Teoretycznie, gdy nie ma przycisku zamknij na górnej belce (górnym pasku), i nie doda się żadnego buttona wywołującego funkcję Close(), a także okienko jest okienkiem dialogowym (na pasku zadań nie widać) takiego okna nie powinno się było dać zamknąć

Nieprawda, o czym się przekonałeś :) To tak jakbyś zamknął furtkę w swoim domu ale zostawił otwartą bramę wjazdową - walczysz z pojedynczymi możliwościami.

Dodaj do kodu okna takie coś:

protected override void OnClosing(CancelEventArgs e)
{ e.Cancel = true; }

W tym momencie okno może mieć przycisk zamknij, 20 buttonów wywołujących Close() i wyświetlać się na trzech różnych paskach a i tak w żaden (prosty) sposób go nie zamkniesz. Okno po prostu "odmawia zamknięcia" się w każdym wypadku.

Ale np. kill procesu skutecznie zamknie twoje 'niezamykalne' okno i cały jego szatański pomiot. No właśnie - po co Ci właściwie takie okno? Do wkurzania użytkownika? ;)

0

Tak, tylko sęk w tym, że wtedy w ogóle się nie da zamknąć okna, a ja chciałem tylko wyłączyć możliwość zamykania go poprzez kombinację klawiszy Alt+F4.
Ale poszukałem jeszcze w necie (jednak wpisywanie słów kluczowych po angielsku czasami bardzo pomaga) i znalazłem takie oto rozwiązanie:
(zaznaczam, iż ja tego nie wymyśliłem siedząc i dumając nad tym, jednak po przeanalizowaniu metoda jest prosta i skuteczna)

Do klasy naszego Form'a dodajemy zmienną np:

bool enableClose;

następnie inicjujemy ją w konstruktorze:

enableClose = true;

A później dodajemy dwa eventy do naszego okna: KeyDown oraz FormClosing, których ciała tak oto wyglądają:

    System::Void loginForm_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e)
    {
        if(enableClose == false)
        {
            enableClose = true;
            e->Cancel = true;
        }
    }
    System::Void loginForm_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e)
    {
        if( (e->KeyCode == Windows::Forms::Keys::F4) && e->Alt )
            enableClose = false;
    }

Zaznaczę jeszcze, iż we właściwościach naszego Form'a (okna), parametr KeyPreview musi być ustawiony na True

Aha, jakby co, źródło z któregoskorzystałem: http://bytes.com/topic/c-shar[...]e-my-form-when-alt-f4-pressed

0

Strasznie kompilkujesz sobie życie, nie lepiej przypisywać enableClose do e->Cancel, z tym, że enableClose ustawiać na false tylko w obsłudze zdarzenia Click przycisku ? I masz załatwione wszystkie sposoby zamknięcia poza wspomnianym zabiciem procesu.

2

A nie lepiej obsłużyć tak samo wszystkie sposoby zamknięcia okna, nieważne czy user robi to twoim super przyciskiem, czy [X], czy alt+F4 etc.
Nieco bardziej świadomi userzy przyzwyczajeni są do pewnych standardów interfejsu, skrótów klawiszowych etc. Czasami nie warto zawracać rzeki kijem.

0

No tak, ale chciałem wprowadzić do programu jakieś najprostsze zabezpieczenie, w postaci logowania. I właśnie problem polegał na tym że okno z polami login, hasło itd można było zamknąć Alt-F4 :( Teraz okno zamyka się po wpisaniu prawidłowych danych (przycisk OK wywołuje Close()), natomiast przycisk Cancel wywołuje ::Application::Exit(); Może to nie jest szczyt zabezpieczeń, ale program też nie steruje bronią masowego rażenia :]

0

Tzn. zrąbałeś koncepcję i próbujesz to idiotycznie obejść utrudniając sobie życie?

Wystarczy przecież, że okno logowania zwróci DialogResult.OK po kliknięciu przycisku logowania, a DialogResult.Cancel w innym przypadku (czyli przy jakimkolwiek zamknięciu). Wówczas po prostu nie odblokowujesz/nie wyświetlasz innych okien programu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0