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