Started working on window monitoring.
This commit is contained in:
parent
e7b8404254
commit
f5d76980d0
9 changed files with 120 additions and 21 deletions
|
@ -10,5 +10,25 @@ namespace SafeExamBrowser.Contracts.Monitoring
|
|||
{
|
||||
public interface IWindowMonitor
|
||||
{
|
||||
/// <summary>
|
||||
/// Hides all currently opened windows.
|
||||
/// </summary>
|
||||
void HideAllWindows();
|
||||
|
||||
/// <summary>
|
||||
/// Restores all windows which were hidden during the startup procedure.
|
||||
/// </summary>
|
||||
void RestoreHiddenWindows();
|
||||
|
||||
/// <summary>
|
||||
/// Starts monitoring application windows by subscribing to specific system events.
|
||||
/// If a window is shown which is not supposed to do so, it will be automatically hidden.
|
||||
/// </summary>
|
||||
void StartMonitoringWindows();
|
||||
|
||||
/// <summary>
|
||||
/// Stops monitoring windows and deregisters from any subscribed system events.
|
||||
/// </summary>
|
||||
void StopMonitoringWindows();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,6 +30,11 @@ namespace SafeExamBrowser.Core.Behaviour.Operations
|
|||
public void Perform()
|
||||
{
|
||||
logger.Info("--- Initializing process monitoring ---");
|
||||
SplashScreen.UpdateText(Key.SplashScreen_WaitExplorerTermination, true);
|
||||
|
||||
processMonitor.CloseExplorerShell();
|
||||
processMonitor.StartMonitoringExplorer();
|
||||
|
||||
SplashScreen.UpdateText(Key.SplashScreen_InitializeProcessMonitoring);
|
||||
|
||||
// TODO
|
||||
|
@ -41,6 +46,11 @@ namespace SafeExamBrowser.Core.Behaviour.Operations
|
|||
SplashScreen.UpdateText(Key.SplashScreen_StopProcessMonitoring);
|
||||
|
||||
// TODO
|
||||
|
||||
SplashScreen.UpdateText(Key.SplashScreen_WaitExplorerStartup, true);
|
||||
|
||||
processMonitor.StopMonitoringExplorer();
|
||||
processMonitor.StartExplorerShell();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@ using SafeExamBrowser.Contracts.Behaviour;
|
|||
using SafeExamBrowser.Contracts.Configuration;
|
||||
using SafeExamBrowser.Contracts.I18n;
|
||||
using SafeExamBrowser.Contracts.Logging;
|
||||
using SafeExamBrowser.Contracts.Monitoring;
|
||||
using SafeExamBrowser.Contracts.UserInterface;
|
||||
|
||||
namespace SafeExamBrowser.Core.Behaviour.Operations
|
||||
|
@ -18,16 +17,14 @@ namespace SafeExamBrowser.Core.Behaviour.Operations
|
|||
public class WorkingAreaOperation : IOperation
|
||||
{
|
||||
private ILogger logger;
|
||||
private IProcessMonitor processMonitor;
|
||||
private ITaskbar taskbar;
|
||||
private IWorkingArea workingArea;
|
||||
|
||||
public ISplashScreen SplashScreen { private get; set; }
|
||||
|
||||
public WorkingAreaOperation(ILogger logger, IProcessMonitor processMonitor, ITaskbar taskbar, IWorkingArea workingArea)
|
||||
public WorkingAreaOperation(ILogger logger, ITaskbar taskbar, IWorkingArea workingArea)
|
||||
{
|
||||
this.logger = logger;
|
||||
this.processMonitor = processMonitor;
|
||||
this.taskbar = taskbar;
|
||||
this.workingArea = workingArea;
|
||||
}
|
||||
|
@ -35,16 +32,11 @@ namespace SafeExamBrowser.Core.Behaviour.Operations
|
|||
public void Perform()
|
||||
{
|
||||
logger.Info("--- Initializing working area ---");
|
||||
SplashScreen.UpdateText(Key.SplashScreen_WaitExplorerTermination, true);
|
||||
|
||||
processMonitor.CloseExplorerShell();
|
||||
processMonitor.StartMonitoringExplorer();
|
||||
SplashScreen.UpdateText(Key.SplashScreen_InitializeWorkingArea);
|
||||
|
||||
// TODO
|
||||
// - Minimizing all open windows
|
||||
// - Emptying clipboard
|
||||
|
||||
SplashScreen.UpdateText(Key.SplashScreen_InitializeWorkingArea);
|
||||
workingArea.InitializeFor(taskbar);
|
||||
}
|
||||
|
||||
|
@ -54,15 +46,9 @@ namespace SafeExamBrowser.Core.Behaviour.Operations
|
|||
SplashScreen.UpdateText(Key.SplashScreen_RestoreWorkingArea);
|
||||
|
||||
// TODO
|
||||
// - Restore all windows?
|
||||
// - Emptying clipboard
|
||||
|
||||
workingArea.Reset();
|
||||
|
||||
SplashScreen.UpdateText(Key.SplashScreen_WaitExplorerStartup, true);
|
||||
|
||||
processMonitor.StopMonitoringExplorer();
|
||||
processMonitor.StartExplorerShell();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
<ItemGroup>
|
||||
<Compile Include="Processes\ProcessMonitor.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Windows\WindowMonitor.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\SafeExamBrowser.Contracts\SafeExamBrowser.Contracts.csproj">
|
||||
|
@ -56,7 +57,6 @@
|
|||
<ItemGroup>
|
||||
<Folder Include="Keyboard\" />
|
||||
<Folder Include="Mouse\" />
|
||||
<Folder Include="Windows\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
50
SafeExamBrowser.Monitoring/Windows/WindowMonitor.cs
Normal file
50
SafeExamBrowser.Monitoring/Windows/WindowMonitor.cs
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (c) 2017 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 SafeExamBrowser.Contracts.Logging;
|
||||
using SafeExamBrowser.Contracts.Monitoring;
|
||||
using SafeExamBrowser.WindowsApi;
|
||||
|
||||
namespace SafeExamBrowser.Monitoring.Windows
|
||||
{
|
||||
public class WindowMonitor : IWindowMonitor
|
||||
{
|
||||
private ILogger logger;
|
||||
|
||||
public WindowMonitor(ILogger logger)
|
||||
{
|
||||
this.logger = logger;
|
||||
|
||||
// TODO: Make operation for window monitor OR operation for all desktop initialization?!
|
||||
// ...
|
||||
}
|
||||
|
||||
public void HideAllWindows()
|
||||
{
|
||||
logger.Info("Minimizing all open windows...");
|
||||
User32.MinimizeAllOpenWindows();
|
||||
logger.Info("Open windows successfully minimized.");
|
||||
}
|
||||
|
||||
public void RestoreHiddenWindows()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void StartMonitoringWindows()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void StopMonitoringWindows()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
16
SafeExamBrowser.WindowsApi/Constants/Constant.cs
Normal file
16
SafeExamBrowser.WindowsApi/Constants/Constant.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
* Copyright (c) 2017 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/.
|
||||
*/
|
||||
|
||||
namespace SafeExamBrowser.WindowsApi.Constants
|
||||
{
|
||||
static class Constant
|
||||
{
|
||||
internal const int WM_COMMAND = 0x111;
|
||||
internal const int MIN_ALL = 419;
|
||||
}
|
||||
}
|
|
@ -40,6 +40,7 @@
|
|||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Constants\Constant.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Constants\SPI.cs" />
|
||||
<Compile Include="Constants\SPIF.cs" />
|
||||
|
|
|
@ -35,7 +35,7 @@ namespace SafeExamBrowser.WindowsApi
|
|||
/// <returns></returns>
|
||||
public static uint GetShellProcessId()
|
||||
{
|
||||
var handle = FindWindow("Shell_TrayWnd", null);
|
||||
var handle = GetShellWindowHandle();
|
||||
var threadId = GetWindowThreadProcessId(handle, out uint processId);
|
||||
|
||||
return processId;
|
||||
|
@ -60,6 +60,16 @@ namespace SafeExamBrowser.WindowsApi
|
|||
return workingArea;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Minimizes all open windows.
|
||||
/// </summary>
|
||||
public static void MinimizeAllOpenWindows()
|
||||
{
|
||||
var handle = GetShellWindowHandle();
|
||||
|
||||
SendMessage(handle, Constant.WM_COMMAND, (IntPtr) Constant.MIN_ALL, IntPtr.Zero);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Instructs the main Windows explorer process to shut down.
|
||||
/// </summary>
|
||||
|
@ -72,8 +82,8 @@ namespace SafeExamBrowser.WindowsApi
|
|||
/// </remarks>
|
||||
public static void PostCloseMessageToShell()
|
||||
{
|
||||
var taskbarHandle = FindWindow("Shell_TrayWnd", null);
|
||||
var success = PostMessage(taskbarHandle, 0x5B4, IntPtr.Zero, IntPtr.Zero);
|
||||
var handle = GetShellWindowHandle();
|
||||
var success = PostMessage(handle, 0x5B4, IntPtr.Zero, IntPtr.Zero);
|
||||
|
||||
if (!success)
|
||||
{
|
||||
|
@ -107,6 +117,9 @@ namespace SafeExamBrowser.WindowsApi
|
|||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
private static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", EntryPoint = "SendMessage")]
|
||||
private static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
static extern bool SystemParametersInfo(SPI uiAction, uint uiParam, ref RECT pvParam, SPIF fWinIni);
|
||||
|
|
|
@ -20,6 +20,7 @@ using SafeExamBrowser.Core.Behaviour.Operations;
|
|||
using SafeExamBrowser.Core.I18n;
|
||||
using SafeExamBrowser.Core.Logging;
|
||||
using SafeExamBrowser.Monitoring.Processes;
|
||||
using SafeExamBrowser.Monitoring.Windows;
|
||||
using SafeExamBrowser.UserInterface;
|
||||
|
||||
namespace SafeExamBrowser
|
||||
|
@ -36,6 +37,7 @@ namespace SafeExamBrowser
|
|||
private IText text;
|
||||
private ITextResource textResource;
|
||||
private IUiElementFactory uiFactory;
|
||||
private IWindowMonitor windowMonitor;
|
||||
private IWorkingArea workingArea;
|
||||
|
||||
public IShutdownController ShutdownController { get; private set; }
|
||||
|
@ -59,13 +61,14 @@ namespace SafeExamBrowser
|
|||
text = new Text(textResource);
|
||||
aboutInfo = new AboutNotificationInfo(text);
|
||||
processMonitor = new ProcessMonitor(new ModuleLogger(logger, typeof(ProcessMonitor)));
|
||||
windowMonitor = new WindowMonitor(new ModuleLogger(logger, typeof(WindowMonitor)));
|
||||
workingArea = new WorkingArea(new ModuleLogger(logger, typeof(WorkingArea)));
|
||||
ShutdownController = new ShutdownController(logger, messageBox, processMonitor, settings, text, uiFactory, workingArea);
|
||||
StartupController = new StartupController(browserController, browserInfo, logger, messageBox, aboutInfo, processMonitor, settings, Taskbar, text, uiFactory, workingArea);
|
||||
|
||||
StartupOperations = new Queue<IOperation>();
|
||||
StartupOperations.Enqueue(new ProcessMonitoringOperation(logger, processMonitor));
|
||||
StartupOperations.Enqueue(new WorkingAreaOperation(logger, processMonitor, Taskbar, workingArea));
|
||||
StartupOperations.Enqueue(new WorkingAreaOperation(logger, Taskbar, workingArea));
|
||||
StartupOperations.Enqueue(new TaskbarInitializationOperation(logger, aboutInfo, Taskbar, uiFactory));
|
||||
StartupOperations.Enqueue(new BrowserInitializationOperation(browserController, browserInfo, logger, Taskbar, uiFactory));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue