From 931228b6f1edc88178927a18bbf088534a907645 Mon Sep 17 00:00:00 2001 From: dbuechel Date: Wed, 8 May 2019 11:02:59 +0200 Subject: [PATCH] SEBWIN-326: Disabled close button for main browser window. --- .../BrowserWindow.xaml.cs | 9 +++++ .../BrowserWindow.xaml.cs | 9 +++++ ...afeExamBrowser.UserInterface.Shared.csproj | 1 + .../Utilities/WindowUtility.cs | 40 +++++++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 SafeExamBrowser.UserInterface.Shared/Utilities/WindowUtility.cs diff --git a/SafeExamBrowser.UserInterface.Desktop/BrowserWindow.xaml.cs b/SafeExamBrowser.UserInterface.Desktop/BrowserWindow.xaml.cs index fd0edf05..789ade1b 100644 --- a/SafeExamBrowser.UserInterface.Desktop/BrowserWindow.xaml.cs +++ b/SafeExamBrowser.UserInterface.Desktop/BrowserWindow.xaml.cs @@ -142,6 +142,14 @@ namespace SafeExamBrowser.UserInterface.Desktop } } + private void BrowserWindow_Loaded(object sender, RoutedEventArgs e) + { + if (isMainWindow) + { + WindowUtility.DisableCloseButtonFor(this); + } + } + private CustomPopupPlacement[] MenuPopup_PlacementCallback(Size popupSize, Size targetSize, Point offset) { return new[] @@ -196,6 +204,7 @@ namespace SafeExamBrowser.UserInterface.Desktop BackwardButton.Click += (o, args) => BackwardNavigationRequested?.Invoke(); Closing += BrowserWindow_Closing; ForwardButton.Click += (o, args) => ForwardNavigationRequested?.Invoke(); + Loaded += BrowserWindow_Loaded; MenuButton.Click += (o, args) => MenuPopup.IsOpen = !MenuPopup.IsOpen; MenuButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => MenuPopup.IsOpen = MenuPopup.IsMouseOver)); MenuPopup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(MenuPopup_PlacementCallback); diff --git a/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml.cs b/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml.cs index f05ef415..019ae83f 100644 --- a/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml.cs +++ b/SafeExamBrowser.UserInterface.Mobile/BrowserWindow.xaml.cs @@ -142,6 +142,14 @@ namespace SafeExamBrowser.UserInterface.Mobile } } + private void BrowserWindow_Loaded(object sender, RoutedEventArgs e) + { + if (isMainWindow) + { + WindowUtility.DisableCloseButtonFor(this); + } + } + private CustomPopupPlacement[] MenuPopup_PlacementCallback(Size popupSize, Size targetSize, Point offset) { return new[] @@ -196,6 +204,7 @@ namespace SafeExamBrowser.UserInterface.Mobile BackwardButton.Click += (o, args) => BackwardNavigationRequested?.Invoke(); Closing += BrowserWindow_Closing; ForwardButton.Click += (o, args) => ForwardNavigationRequested?.Invoke(); + Loaded += BrowserWindow_Loaded; MenuButton.Click += (o, args) => MenuPopup.IsOpen = !MenuPopup.IsOpen; MenuButton.MouseLeave += (o, args) => Task.Delay(250).ContinueWith(_ => Dispatcher.Invoke(() => MenuPopup.IsOpen = MenuPopup.IsMouseOver)); MenuPopup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(MenuPopup_PlacementCallback); diff --git a/SafeExamBrowser.UserInterface.Shared/SafeExamBrowser.UserInterface.Shared.csproj b/SafeExamBrowser.UserInterface.Shared/SafeExamBrowser.UserInterface.Shared.csproj index 3b9fe27f..54a92da2 100644 --- a/SafeExamBrowser.UserInterface.Shared/SafeExamBrowser.UserInterface.Shared.csproj +++ b/SafeExamBrowser.UserInterface.Shared/SafeExamBrowser.UserInterface.Shared.csproj @@ -67,6 +67,7 @@ + diff --git a/SafeExamBrowser.UserInterface.Shared/Utilities/WindowUtility.cs b/SafeExamBrowser.UserInterface.Shared/Utilities/WindowUtility.cs new file mode 100644 index 00000000..69fb622c --- /dev/null +++ b/SafeExamBrowser.UserInterface.Shared/Utilities/WindowUtility.cs @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using System; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Interop; + +namespace SafeExamBrowser.UserInterface.Shared.Utilities +{ + public static class WindowUtility + { + private const uint MF_BYCOMMAND = 0x00000000; + private const uint MF_GRAYED = 0x00000001; + private const uint MF_ENABLED = 0x00000000; + private const uint SC_CLOSE = 0xF060; + + public static void DisableCloseButtonFor(Window window) + { + var handle = new WindowInteropHelper(window); + var systemMenu = GetSystemMenu(handle.Handle, false); + + if (systemMenu != IntPtr.Zero) + { + EnableMenuItem(systemMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED); + } + } + + [DllImport("user32.dll")] + private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert); + + [DllImport("user32.dll")] + private static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); + } +}