Feedback

C# - Meldung beim Abmelden anzeigen

Veröffentlicht von am 03.11.2013
(0 Bewertungen)
Man kennt dieses Feature von Programmen wie Word, die sich bei ungesicherten Änderungen beim Herunterfahren bemerkbar machen.

Das kann man selbst recht leicht implementieren. Im nachfolgenden mit Kommentaren für Windows Forms.
Getestet unter Windows 8.1.

In WPF kann man die Methoden genauso aufrufen, das Herunterfahren abbrechen muss man mit dem Application.SessionEnding-Event:
http://msdn.microsoft.com/de-de/library/vstudio/system.windows.application.sessionending.aspx
Wie man an das Handle eines WPF-Fensters kommt, ist in folgendem Snippet erläutert:
http://dotnet-snippets.de/snippet/handle-eines-wpf-fensters-ermitteln/607

Das Handle muss von einem gültigem Fenster stammen, sonst geht es nicht.

Um das Herunterfahren wieder zu erlauben muss blockLogof (bzw. e.Cancel im WPF-Event) auf False gestellt werden. Sobald das Programm beendet ist, wird WndProc (bzw. das Event) nicht mehr durchlaufen, weswegen es dann keine Rolle mehr spielt.
GFU-Schulungen  [Anzeige]

XML und .NET Überblick

Um auf dem neuesten Wissensstand zu sein, sollten Sie unser aktuelles ASP .NET Komplett Seminar belegen.
Nach dem Seminar kennen Sie die wichtigsten Strömungen in der Software-Technologie

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

//http://www.pinvoke.net/default.aspx/user32.shutdownblockreasoncreate
[DllImport("user32.dll")]
private extern static bool ShutdownBlockReasonCreate(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)] string pwszReason);//Handle des Fensters und Nachricht

//http://www.pinvoke.net/default.aspx/user32/ShutdownBlockReasonDestroy.html
[DllImport("user32.dll")]
private extern static bool ShutdownBlockReasonDestroy(IntPtr hWnd);//Handle des Fensters

//Windows Nachrichten
const int WM_QUERYENDSESSION = 0x11;
const int WM_ENDSESSION = 0x16;
const int WM_CANCELMODE = 0x1F;

bool blockLogof = false;//Auf true stellen um Herunterfahren zu blockieren.

//Empfängt alle Meldungen, die an das Fenster gesendet wurden.
protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM_ENDSESSION:
        case WM_QUERYENDSESSION://Sitzung wird beendet
            if(!blockLogof)//Herunterfahren ggf. erlauben
                base.WndProc(ref m);
            else
            {
	        Message msg = new Message() { Msg = WM_CANCELMODE };//Neue Nachricht erstellen
                base.WndProc(ref msg);//An Windows weiter leiten
            }
            return;
        default:
            base.WndProc(ref m);//Andere Nachrichten einfach weiter leiten
            return;
    }
}

private void buttonBlock_Click(object sender, EventArgs e)
{
    blockLogof = true;
    var result = ShutdownBlockReasonCreate(this.Handle, textBox1.Text);
    // eine Benutzerdefinierte Meldung angeben
    if (!result)
        MessageBox.Show("Fehler beim setzen der Nachricht");
}

private void buttonAllow_Click(object sender, EventArgs e)
{
    var result = ShutdownBlockReasonDestroy(this.Handle);
    //Meldung wieder entfernen
    if (!result)
        MessageBox.Show("Fehler beim löschen der Nachricht");
    blockLogof = false;
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!