Kolumne XAML Expertise: WPF und Windows-Apps

XAML-Tipp: WPF – Schließen-Button ausblenden
Kommentare

In der Kolumne „XAML Expertise“ präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „WPF: Schließen-Button ausblenden“.

WPF: „Schließen“-Button ausblenden

Der Kioskmodus ist ein spezieller Modus, der den Benutzer meist auf eine Hauptanwendung einschränkt. So soll der Benutzer sie auch nicht mehr direkt beenden können. Diese Aufgabe hört sich einfacher an, als sie mit WPF umgesetzt werden kann, denn WPF bietet zum Anpassen von Windows-Fenstern nur die Eigenschaften ResizeMode, WindowState, und WindowStyle. Keine dieser Eigenschaften ermöglicht das Ausblenden des Schließen-Buttons, aber durch einen kleinen Trick lässt sich der Button dennoch ausblenden.

WPF, und damit ebenfalls das .NET Framework, bieten keine Möglichkeit zum Ausblenden des Schließen-Buttons. Das Zeichnen des äußeren Windows-Fensters erfolgt allerdings durch das Betriebssystem selbst. So kann durch Platform Invocation Services (PInvoke) ein Aufruf von Managed-Code auf Unmanaged-Funktionen erfolgen, zum Beispiel auf das Component Object Model (COM). Der Nachteil hierbei ist, dass PInvoke-Aufrufe ohne ausführliche Dokumentation wahnsinnig komplex sind. So bleibt zur Lösung einfach das direkte Abschreiben des Codes aus Listing 1 innerhalb der gewünschten Window-Klasse.

using System;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Interop;

namespace WpfKioskModeSample
{
  public partial class MainWindow : Window
  {
    private const int GWL_STYLE = -16;
    private const int WS_SYSMENU = 0x80000;
    [DllImport("user32.dll", SetLastError = true)]
    private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
    [DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);

    public MainWindow()
    {
      InitializeComponent();
      Loaded += OnWindowLoaded;
    }

    private void OnWindowLoaded(object sender, RoutedEventArgs e)
    {
      var hwnd = new WindowInteropHelper(this).Handle;
      SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
    }
  }
}

Wird jetzt die WPF-Anwendung ausgeführt, wird sie ohne die bekannten Minimier-,Maximier- und Schließen-Buttons angezeigt (Abb. 1). Der Benutzer kann allerdings die Anwendung weiterhin durch die Tastenkombination ALT + F4 beenden. Um das zu umgehen, überschreibt man die OnClosing-Methode der Window-Klasse und beendet die weitere Verarbeitung durch die CancelEventArgs, wie im folgenden Codebeispiel gezeigt:

protected override void OnClosing(CancelEventArgs e)

{

e.Cancel = true;

}

Um den Zugriff auf den Task Manager zu verhindern und weitere Einschränkungen im Betriebssystem zu ermöglichen, bietet Windows 8.1/10 das Assigned Access Feature. Damit lässt sich Windows beliebig für einen Kioskmodus einschränken.

Abb. 1: WPF-Anwendung ohne „Schließen“-Button

Abb. 1: WPF-Anwendung ohne „Schließen“-Button

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist der Windows Developer ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -