#region Imports
|
|
using System;
|
using System.Drawing;
|
using System.Runtime.InteropServices;
|
using System.Security;
|
|
#endregion
|
|
namespace DPumpHydr.WinFrmUI.RLT.Native
|
{
|
#region TaskBarNative
|
|
#region General
|
|
public enum TaskBarPosition
|
{
|
Unknown = -1,
|
Left,
|
Top,
|
Right,
|
Bottom,
|
}
|
|
#endregion
|
|
internal class TaskBar
|
{
|
private const string ClassName = "Shell_TrayWnd";
|
|
private Rectangle bounds = Rectangle.Empty;
|
public Rectangle Bounds
|
{
|
get => bounds;
|
private set => bounds = value;
|
}
|
public TaskBarPosition Position { get; private set; } = TaskBarPosition.Unknown;
|
|
public Point Location => Bounds.Location;
|
|
public Size Size => Bounds.Size;
|
|
public bool AlwaysOnTop { get; private set; } = false;
|
public bool AutoHide { get; private set; } = false;
|
|
[SecuritySafeCritical]
|
public TaskBar()
|
{
|
IntPtr taskbarHandle = WinApi.FindWindow(ClassName, null);
|
|
WinApi.APPBARDATA data = new()
|
{
|
cbSize = (uint)Marshal.SizeOf(typeof(WinApi.APPBARDATA)),
|
hWnd = taskbarHandle
|
};
|
IntPtr result = WinApi.SHAppBarMessage(WinApi.ABM.GetTaskbarPos, ref data);
|
if (result == IntPtr.Zero)
|
{
|
throw new InvalidOperationException();
|
}
|
|
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(WinApi.APPBARDATA));
|
result = WinApi.SHAppBarMessage(WinApi.ABM.GetState, ref data);
|
int state = result.ToInt32();
|
AlwaysOnTop = (state & WinApi.AlwaysOnTop) == WinApi.AlwaysOnTop;
|
AutoHide = (state & WinApi.Autohide) == WinApi.Autohide;
|
}
|
|
}
|
|
#endregion
|
}
|