SEBWIN-220: Implemented mechanism to prevent (accidental) closing of taskbar by ALT+F4.

This commit is contained in:
dbuechel 2018-06-21 08:54:43 +02:00
parent 50dcb7502a
commit cd5bbfcb47
9 changed files with 60 additions and 11 deletions

View file

@ -7,6 +7,7 @@
*/ */
using System; using System;
using System.ComponentModel;
using System.IO; using System.IO;
using SafeExamBrowser.Contracts.Behaviour; using SafeExamBrowser.Contracts.Behaviour;
using SafeExamBrowser.Contracts.Behaviour.OperationModel; using SafeExamBrowser.Contracts.Behaviour.OperationModel;
@ -250,7 +251,7 @@ namespace SafeExamBrowser.Client.Behaviour
shutdown.Invoke(); shutdown.Invoke();
} }
private void Taskbar_QuitButtonClicked() private void Taskbar_QuitButtonClicked(CancelEventArgs args)
{ {
var result = messageBox.Show(TextKey.MessageBox_Quit, TextKey.MessageBox_QuitTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question); var result = messageBox.Show(TextKey.MessageBox_Quit, TextKey.MessageBox_QuitTitle, MessageBoxAction.YesNo, MessageBoxIcon.Question);
@ -266,6 +267,10 @@ namespace SafeExamBrowser.Client.Behaviour
messageBox.Show(TextKey.MessageBox_QuitError, TextKey.MessageBox_QuitErrorTitle, icon: MessageBoxIcon.Error); messageBox.Show(TextKey.MessageBox_QuitError, TextKey.MessageBox_QuitErrorTitle, icon: MessageBoxIcon.Error);
} }
} }
else
{
args.Cancel = true;
}
} }
private void WindowMonitor_WindowChanged(IntPtr window) private void WindowMonitor_WindowChanged(IntPtr window)

View file

@ -8,5 +8,8 @@
namespace SafeExamBrowser.Contracts.Browser namespace SafeExamBrowser.Contracts.Browser
{ {
/// <summary>
/// Event handler used to control (e.g. allow or prohibit) download requests.
/// </summary>
public delegate void DownloadRequestedEventHandler(string fileName, DownloadEventArgs args); public delegate void DownloadRequestedEventHandler(string fileName, DownloadEventArgs args);
} }

View file

@ -138,6 +138,7 @@
<Compile Include="UserInterface\Browser\IBrowserWindow.cs" /> <Compile Include="UserInterface\Browser\IBrowserWindow.cs" />
<Compile Include="UserInterface\MessageBox\IMessageBox.cs" /> <Compile Include="UserInterface\MessageBox\IMessageBox.cs" />
<Compile Include="UserInterface\IProgressIndicator.cs" /> <Compile Include="UserInterface\IProgressIndicator.cs" />
<Compile Include="UserInterface\Taskbar\QuitButtonClickedEventHandler.cs" />
<Compile Include="UserInterface\Windows\IRuntimeWindow.cs" /> <Compile Include="UserInterface\Windows\IRuntimeWindow.cs" />
<Compile Include="UserInterface\MessageBox\MessageBoxResult.cs" /> <Compile Include="UserInterface\MessageBox\MessageBoxResult.cs" />
<Compile Include="UserInterface\Taskbar\INotificationButton.cs" /> <Compile Include="UserInterface\Taskbar\INotificationButton.cs" />

View file

@ -8,8 +8,6 @@
namespace SafeExamBrowser.Contracts.UserInterface.Taskbar namespace SafeExamBrowser.Contracts.UserInterface.Taskbar
{ {
public delegate void QuitButtonClickedEventHandler();
/// <summary> /// <summary>
/// Defines the functionality of the application taskbar. The taskbar is the main user interface element via which the user can access /// Defines the functionality of the application taskbar. The taskbar is the main user interface element via which the user can access
/// the browser, third-party applications, system controls and so on. /// the browser, third-party applications, system controls and so on.

View file

@ -0,0 +1,17 @@
/*
* Copyright (c) 2018 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.ComponentModel;
namespace SafeExamBrowser.Contracts.UserInterface.Taskbar
{
/// <summary>
/// Event handler used to define the control flow when the <see cref="ITaskbar"/>'s quit button is clicked.
/// </summary>
public delegate void QuitButtonClickedEventHandler(CancelEventArgs args);
}

View file

@ -7,6 +7,7 @@
*/ */
using System; using System;
using System.ComponentModel;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using SafeExamBrowser.Contracts.UserInterface.Taskbar; using SafeExamBrowser.Contracts.UserInterface.Taskbar;
@ -16,7 +17,7 @@ namespace SafeExamBrowser.UserInterface.Classic.Controls
{ {
public partial class QuitButton : UserControl public partial class QuitButton : UserControl
{ {
public QuitButtonClickedEventHandler Clicked; public event QuitButtonClickedEventHandler Clicked;
public QuitButton() public QuitButton()
{ {
@ -26,7 +27,7 @@ namespace SafeExamBrowser.UserInterface.Classic.Controls
private void Button_Click(object sender, RoutedEventArgs e) private void Button_Click(object sender, RoutedEventArgs e)
{ {
Clicked?.Invoke(); Clicked?.Invoke(new CancelEventArgs());
} }
private void LoadIcon() private void LoadIcon()

View file

@ -16,6 +16,7 @@ namespace SafeExamBrowser.UserInterface.Classic
{ {
public partial class Taskbar : Window, ITaskbar public partial class Taskbar : Window, ITaskbar
{ {
private bool allowClose;
private ILogger logger; private ILogger logger;
public event QuitButtonClickedEventHandler QuitButtonClicked; public event QuitButtonClickedEventHandler QuitButtonClicked;
@ -28,7 +29,7 @@ namespace SafeExamBrowser.UserInterface.Classic
Closing += Taskbar_Closing; Closing += Taskbar_Closing;
Loaded += (o, args) => InitializeBounds(); Loaded += (o, args) => InitializeBounds();
QuitButton.Clicked += () => QuitButtonClicked?.Invoke(); QuitButton.Clicked += QuitButton_Clicked;
} }
public void AddApplication(IApplicationButton button) public void AddApplication(IApplicationButton button)
@ -87,8 +88,21 @@ namespace SafeExamBrowser.UserInterface.Classic
}); });
} }
private void QuitButton_Clicked(CancelEventArgs args)
{
QuitButtonClicked?.Invoke(args);
allowClose = !args.Cancel;
}
private void Taskbar_Closing(object sender, CancelEventArgs e) private void Taskbar_Closing(object sender, CancelEventArgs e)
{ {
if (!allowClose)
{
e.Cancel = true;
return;
}
foreach (var child in SystemControlStackPanel.Children) foreach (var child in SystemControlStackPanel.Children)
{ {
if (child is ISystemControl systemControl) if (child is ISystemControl systemControl)

View file

@ -6,6 +6,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
using System.ComponentModel;
using System.Windows; using System.Windows;
using System.Windows.Controls; using System.Windows.Controls;
using SafeExamBrowser.Contracts.UserInterface.Taskbar; using SafeExamBrowser.Contracts.UserInterface.Taskbar;
@ -23,7 +24,7 @@ namespace SafeExamBrowser.UserInterface.Windows10.Controls
private void Button_Click(object sender, RoutedEventArgs e) private void Button_Click(object sender, RoutedEventArgs e)
{ {
Clicked?.Invoke(); Clicked?.Invoke(new CancelEventArgs());
} }
} }
} }

View file

@ -16,6 +16,7 @@ namespace SafeExamBrowser.UserInterface.Windows10
{ {
public partial class Taskbar : Window, ITaskbar public partial class Taskbar : Window, ITaskbar
{ {
private bool allowClose;
private ILogger logger; private ILogger logger;
public event QuitButtonClickedEventHandler QuitButtonClicked; public event QuitButtonClickedEventHandler QuitButtonClicked;
@ -26,9 +27,9 @@ namespace SafeExamBrowser.UserInterface.Windows10
InitializeComponent(); InitializeComponent();
Loaded += (o, args) => InitializeBounds();
Closing += Taskbar_Closing; Closing += Taskbar_Closing;
QuitButtonClicked += Taskbar_QuitButtonClicked; Loaded += (o, args) => InitializeBounds();
QuitButtonClicked += QuitButton_Clicked;
} }
public void AddApplication(IApplicationButton button) public void AddApplication(IApplicationButton button)
@ -87,13 +88,21 @@ namespace SafeExamBrowser.UserInterface.Windows10
}); });
} }
private void Taskbar_QuitButtonClicked() private void QuitButton_Clicked(CancelEventArgs args)
{ {
QuitButtonClicked?.Invoke(); QuitButtonClicked?.Invoke(args);
allowClose = !args.Cancel;
} }
private void Taskbar_Closing(object sender, CancelEventArgs e) private void Taskbar_Closing(object sender, CancelEventArgs e)
{ {
if (!allowClose)
{
e.Cancel = true;
return;
}
foreach (var child in SystemControlStackPanel.Children) foreach (var child in SystemControlStackPanel.Children)
{ {
if (child is ISystemControl systemControl) if (child is ISystemControl systemControl)