133 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using System;
							 | 
						|||
| 
								 | 
							
								using System.Drawing;
							 | 
						|||
| 
								 | 
							
								using System.Runtime.InteropServices;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace DM_Weight.util.TabTip
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    internal enum TaskbarPosition
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        Unknown = -1,
							 | 
						|||
| 
								 | 
							
								        Left,
							 | 
						|||
| 
								 | 
							
								        Top,
							 | 
						|||
| 
								 | 
							
								        Right,
							 | 
						|||
| 
								 | 
							
								        Bottom,
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    internal sealed class Taskbar
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private const string ClassName = "Shell_TrayWnd";
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public Rectangle Bounds { get; }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public TaskbarPosition Position
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get;
							 | 
						|||
| 
								 | 
							
								            private set;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public Point Location => Bounds.Location;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public Size Size => Bounds.Size;
							 | 
						|||
| 
								 | 
							
								        
							 | 
						|||
| 
								 | 
							
								        //Always returns false under Windows 7
							 | 
						|||
| 
								 | 
							
								        public bool AlwaysOnTop
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get;
							 | 
						|||
| 
								 | 
							
								            private set;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public bool AutoHide
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            get;
							 | 
						|||
| 
								 | 
							
								            private set;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        public Taskbar()
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            IntPtr taskbarHandle = User32.FindWindow(ClassName, null);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            APPBARDATA data = new APPBARDATA
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                cbSize = (uint) Marshal.SizeOf(typeof (APPBARDATA)),
							 | 
						|||
| 
								 | 
							
								                hWnd = taskbarHandle
							 | 
						|||
| 
								 | 
							
								            };
							 | 
						|||
| 
								 | 
							
								            IntPtr result = Shell32.SHAppBarMessage(ABM.GetTaskbarPos, ref data);
							 | 
						|||
| 
								 | 
							
								            if (result != IntPtr.Zero)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                Position = (TaskbarPosition) data.uEdge;
							 | 
						|||
| 
								 | 
							
								                Bounds = Rectangle.FromLTRB(data.rc.left, data.rc.top, data.rc.right, data.rc.bottom);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								                data.cbSize = (uint) Marshal.SizeOf(typeof(APPBARDATA));
							 | 
						|||
| 
								 | 
							
								                result = Shell32.SHAppBarMessage(ABM.GetState, ref data);
							 | 
						|||
| 
								 | 
							
								                int state = result.ToInt32();
							 | 
						|||
| 
								 | 
							
								                AlwaysOnTop = (state & ABS.AlwaysOnTop) == ABS.AlwaysOnTop;
							 | 
						|||
| 
								 | 
							
								                AutoHide = (state & ABS.Autohide) == ABS.Autohide;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                Position = TaskbarPosition.Unknown;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private enum ABM : uint
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            New = 0x00000000,
							 | 
						|||
| 
								 | 
							
								            Remove = 0x00000001,
							 | 
						|||
| 
								 | 
							
								            QueryPos = 0x00000002,
							 | 
						|||
| 
								 | 
							
								            SetPos = 0x00000003,
							 | 
						|||
| 
								 | 
							
								            GetState = 0x00000004,
							 | 
						|||
| 
								 | 
							
								            GetTaskbarPos = 0x00000005,
							 | 
						|||
| 
								 | 
							
								            Activate = 0x00000006,
							 | 
						|||
| 
								 | 
							
								            GetAutoHideBar = 0x00000007,
							 | 
						|||
| 
								 | 
							
								            SetAutoHideBar = 0x00000008,
							 | 
						|||
| 
								 | 
							
								            WindowPosChanged = 0x00000009,
							 | 
						|||
| 
								 | 
							
								            SetState = 0x0000000A,
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private enum ABE : uint
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            Left = 0,
							 | 
						|||
| 
								 | 
							
								            Top = 1,
							 | 
						|||
| 
								 | 
							
								            Right = 2,
							 | 
						|||
| 
								 | 
							
								            Bottom = 3
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static class ABS
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            public const int Autohide = 0x0000001;
							 | 
						|||
| 
								 | 
							
								            public const int AlwaysOnTop = 0x0000002;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static class Shell32
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            [DllImport("shell32.dll", SetLastError = true)]
							 | 
						|||
| 
								 | 
							
								            public static extern IntPtr SHAppBarMessage(ABM dwMessage, [In] ref APPBARDATA pData);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        private static class User32
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            [DllImport("user32.dll", SetLastError = true)]
							 | 
						|||
| 
								 | 
							
								            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        [StructLayout(LayoutKind.Sequential)]
							 | 
						|||
| 
								 | 
							
								        private struct APPBARDATA
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            public uint cbSize;
							 | 
						|||
| 
								 | 
							
								            public IntPtr hWnd;
							 | 
						|||
| 
								 | 
							
								            public uint uCallbackMessage;
							 | 
						|||
| 
								 | 
							
								            public ABE uEdge;
							 | 
						|||
| 
								 | 
							
								            public RECT rc;
							 | 
						|||
| 
								 | 
							
								            public int lParam;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        [StructLayout(LayoutKind.Sequential)]
							 | 
						|||
| 
								 | 
							
								        private struct RECT
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            public int left;
							 | 
						|||
| 
								 | 
							
								            public int top;
							 | 
						|||
| 
								 | 
							
								            public int right;
							 | 
						|||
| 
								 | 
							
								            public int bottom;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |