123 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Drawing;
 | |
| using System.Runtime.InteropServices;
 | |
| using EveOPreview.Services.Interop;
 | |
| 
 | |
| namespace EveOPreview.Services.Implementation
 | |
| {
 | |
| 	sealed class WindowManager : IWindowManager
 | |
| 	{
 | |
| 		#region Private constants
 | |
| 		private const int WINDOW_SIZE_THRESHOLD = 300;
 | |
| 		#endregion
 | |
| 
 | |
| 		public WindowManager()
 | |
| 		{
 | |
| 			// Composition is always enabled for Windows 8+
 | |
| 			this.IsCompositionEnabled = 
 | |
| 				((Environment.OSVersion.Version.Major == 6) && (Environment.OSVersion.Version.Minor >= 2)) // Win 8 and Win 8.1
 | |
| 				|| (Environment.OSVersion.Version.Major >= 10) // Win 10
 | |
| 				|| DwmNativeMethods.DwmIsCompositionEnabled(); // In case of Win 7 an API call is requiredWin 7
 | |
| 		}
 | |
| 
 | |
| 		public bool IsCompositionEnabled { get; }
 | |
| 
 | |
| 		public IntPtr GetForegroundWindowHandle()
 | |
| 		{
 | |
| 			return User32NativeMethods.GetForegroundWindow();
 | |
| 		}
 | |
| 
 | |
| 		public void ActivateWindow(IntPtr handle)
 | |
| 		{
 | |
| 			User32NativeMethods.SetForegroundWindow(handle);
 | |
| 
 | |
| 			int style = User32NativeMethods.GetWindowLong(handle, InteropConstants.GWL_STYLE);
 | |
| 
 | |
| 			if ((style & InteropConstants.WS_MINIMIZE) == InteropConstants.WS_MINIMIZE)
 | |
| 			{
 | |
| 				User32NativeMethods.ShowWindowAsync(handle, InteropConstants.SW_RESTORE);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public void MinimizeWindow(IntPtr handle, bool enableAnimation)
 | |
| 		{
 | |
| 			if (enableAnimation)
 | |
| 			{
 | |
| 				User32NativeMethods.SendMessage(handle, InteropConstants.WM_SYSCOMMAND, InteropConstants.SC_MINIMIZE, 0);
 | |
| 			}
 | |
| 			else
 | |
| 			{
 | |
| 				WINDOWPLACEMENT param = new WINDOWPLACEMENT();
 | |
| 				param.length = Marshal.SizeOf(typeof(WINDOWPLACEMENT));
 | |
| 				User32NativeMethods.GetWindowPlacement(handle, ref param);
 | |
| 				param.showCmd = WINDOWPLACEMENT.SW_MINIMIZE;
 | |
| 				User32NativeMethods.SetWindowPlacement(handle, ref param);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public void MoveWindow(IntPtr handle, int left, int top, int width, int height)
 | |
| 		{
 | |
| 			User32NativeMethods.MoveWindow(handle, left, top, width, height, true);
 | |
| 		}
 | |
| 
 | |
| 		public void MaximizeWindow(IntPtr handle)
 | |
| 		{
 | |
| 			User32NativeMethods.ShowWindowAsync(handle, InteropConstants.SW_SHOWMAXIMIZED);
 | |
| 		}
 | |
| 
 | |
| 		public (int Left, int Top, int Right, int Bottom) GetWindowPosition(IntPtr handle)
 | |
| 		{
 | |
| 			User32NativeMethods.GetWindowRect(handle, out RECT windowRectangle);
 | |
| 
 | |
| 			return (windowRectangle.Left, windowRectangle.Top, windowRectangle.Right, windowRectangle.Bottom);
 | |
| 		}
 | |
| 
 | |
| 		public bool IsWindowMaximized(IntPtr handle)
 | |
| 		{
 | |
| 			return User32NativeMethods.IsZoomed(handle);
 | |
| 		}
 | |
| 
 | |
| 		public bool IsWindowMinimized(IntPtr handle)
 | |
| 		{
 | |
| 			return User32NativeMethods.IsIconic(handle);
 | |
| 		}
 | |
| 
 | |
| 		public IDwmThumbnail GetLiveThumbnail(IntPtr destination, IntPtr source)
 | |
| 		{
 | |
| 			IDwmThumbnail thumbnail = new DwmThumbnail(this);
 | |
| 			thumbnail.Register(destination, source);
 | |
| 
 | |
| 			return thumbnail;
 | |
| 		}
 | |
| 
 | |
| 		public Image GetStaticThumbnail(IntPtr source)
 | |
| 		{
 | |
| 			var sourceContext = User32NativeMethods.GetDC(source);
 | |
| 
 | |
| 			User32NativeMethods.GetClientRect(source, out RECT windowRect);
 | |
| 
 | |
| 			var width = windowRect.Right - windowRect.Left;
 | |
| 			var height = windowRect.Bottom - windowRect.Top;
 | |
| 
 | |
| 			// Check if there is anything to make thumbnail of
 | |
| 			if ((width < WINDOW_SIZE_THRESHOLD) || (height < WINDOW_SIZE_THRESHOLD))
 | |
| 			{
 | |
| 				return null;
 | |
| 			}
 | |
| 
 | |
| 			var destContext = Gdi32NativeMethods.CreateCompatibleDC(sourceContext);
 | |
| 			var bitmap = Gdi32NativeMethods.CreateCompatibleBitmap(sourceContext, width, height);
 | |
| 
 | |
| 			var oldBitmap = Gdi32NativeMethods.SelectObject(destContext, bitmap);
 | |
| 			Gdi32NativeMethods.BitBlt(destContext, 0, 0, width, height, sourceContext, 0, 0, Gdi32NativeMethods.SRCCOPY);
 | |
| 			Gdi32NativeMethods.SelectObject(destContext, oldBitmap);
 | |
| 			Gdi32NativeMethods.DeleteDC(destContext);
 | |
| 			User32NativeMethods.ReleaseDC(source, sourceContext);
 | |
| 
 | |
| 			Image image = Image.FromHbitmap(bitmap);
 | |
| 			Gdi32NativeMethods.DeleteObject(bitmap);
 | |
| 
 | |
| 			return image;
 | |
| 		}
 | |
| 	}
 | |
| } | 
