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
 | 
						|
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |