102 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using System;
							 | 
						|||
| 
								 | 
							
								using System.Drawing;
							 | 
						|||
| 
								 | 
							
								using System.Runtime.InteropServices;
							 | 
						|||
| 
								 | 
							
								using System.Windows;
							 | 
						|||
| 
								 | 
							
								using System.Windows.Interop;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace DM_Weight.util.TabTip
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    internal class Screen
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public Rectangle Bounds { get; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public Screen(Window window)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            IntPtr windowHandle = window != null ? new WindowInteropHelper(window).Handle : IntPtr.Zero;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            IntPtr monitor = window != null ? NativeMethods.MonitorFromWindow(windowHandle, NativeMethods.MONITOR_DEFAULTTONEAREST) : NativeMethods.MonitorFromPoint(new NativeMethods.POINT(0, 0), NativeMethods.MonitorOptions.MONITOR_DEFAULTTOPRIMARY);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            NativeMethods.NativeMonitorInfo monitorInfo = new NativeMethods.NativeMonitorInfo();
							 | 
						|||
| 
								 | 
							
								            NativeMethods.GetMonitorInfo(monitor, monitorInfo);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            Bounds = Rectangle.FromLTRB(monitorInfo.Monitor.Left, monitorInfo.Monitor.Top, monitorInfo.Monitor.Right, monitorInfo.Monitor.Bottom);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static class NativeMethods
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            public const Int32 MONITOR_DEFAULTTONEAREST = 0x00000002;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            [DllImport("user32.dll")]
							 | 
						|||
| 
								 | 
							
								            public static extern IntPtr MonitorFromWindow(IntPtr handle, Int32 flags);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            [DllImport("user32.dll")]
							 | 
						|||
| 
								 | 
							
								            public static extern bool GetMonitorInfo(IntPtr hMonitor, NativeMonitorInfo lpmi);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            [Serializable, StructLayout(LayoutKind.Sequential)]
							 | 
						|||
| 
								 | 
							
								            public struct NativeRectangle
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                public readonly int Left;
							 | 
						|||
| 
								 | 
							
								                public readonly int Top;
							 | 
						|||
| 
								 | 
							
								                public readonly int Right;
							 | 
						|||
| 
								 | 
							
								                public readonly int Bottom;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            [StructLayout(LayoutKind.Sequential)]
							 | 
						|||
| 
								 | 
							
								            public struct POINT
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                public int X;
							 | 
						|||
| 
								 | 
							
								                public int Y;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                public POINT(int x, int y)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    this.X = x;
							 | 
						|||
| 
								 | 
							
								                    this.Y = y;
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                public POINT(System.Drawing.Point pt) : this(pt.X, pt.Y) { }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                public static implicit operator System.Drawing.Point(POINT p)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    return new System.Drawing.Point(p.X, p.Y);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                public static implicit operator POINT(System.Drawing.Point p)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    return new POINT(p.X, p.Y);
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            [DllImport("user32.dll", SetLastError = true)]
							 | 
						|||
| 
								 | 
							
								            internal static extern IntPtr MonitorFromPoint(POINT pt, MonitorOptions dwFlags);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            internal enum MonitorOptions : uint
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                MONITOR_DEFAULTTONULL = 0x00000000,
							 | 
						|||
| 
								 | 
							
								                MONITOR_DEFAULTTOPRIMARY = 0x00000001,
							 | 
						|||
| 
								 | 
							
								                MONITOR_DEFAULTTONEAREST = 0x00000002
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#pragma warning disable 169
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
							 | 
						|||
| 
								 | 
							
								            public sealed class NativeMonitorInfo
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // ReSharper disable once UnusedMember.Local
							 | 
						|||
| 
								 | 
							
								                public Int32 Size = Marshal.SizeOf(typeof(NativeMonitorInfo));
							 | 
						|||
| 
								 | 
							
								#pragma warning disable 649
							 | 
						|||
| 
								 | 
							
								                public NativeRectangle Monitor;
							 | 
						|||
| 
								 | 
							
								#pragma warning restore 649
							 | 
						|||
| 
								 | 
							
								                public NativeRectangle Work;
							 | 
						|||
| 
								 | 
							
								                public Int32 Flags;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								#pragma warning restore 169
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |