Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/Hardcodet/Wpf/TaskbarNotification/Interop/AppBarInfo.cs

99 lines
2.0 KiB
C#

using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace Hardcodet.Wpf.TaskbarNotification.Interop
{
public class AppBarInfo
{
public enum ScreenEdge
{
Undefined = -1,
Left = 0,
Top = 1,
Right = 2,
Bottom = 3
}
private struct APPBARDATA
{
public uint cbSize;
public IntPtr hWnd;
public uint uCallbackMessage;
public uint uEdge;
public RECT rc;
public int lParam;
}
private struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
private const int ABE_BOTTOM = 3;
private const int ABE_LEFT = 0;
private const int ABE_RIGHT = 2;
private const int ABE_TOP = 1;
private const int ABM_GETTASKBARPOS = 5;
private const uint SPI_GETWORKAREA = 48u;
private APPBARDATA m_data;
public ScreenEdge Edge => (ScreenEdge)m_data.uEdge;
public Rectangle WorkArea => GetRectangle(m_data.rc);
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("shell32.dll")]
private static extern uint SHAppBarMessage(uint dwMessage, ref APPBARDATA data);
[DllImport("user32.dll")]
private static extern int SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni);
private Rectangle GetRectangle(RECT rc)
{
return new Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
}
public void GetPosition(string strClassName, string strWindowName)
{
m_data = default(APPBARDATA);
m_data.cbSize = (uint)Marshal.SizeOf(m_data.GetType());
IntPtr intPtr = FindWindow(strClassName, strWindowName);
if (intPtr != IntPtr.Zero)
{
uint num = SHAppBarMessage(5u, ref m_data);
if (num != 1)
{
throw new Exception("Failed to communicate with the given AppBar");
}
return;
}
throw new Exception("Failed to find an AppBar that matched the given criteria");
}
public void GetSystemTaskBarPosition()
{
GetPosition("Shell_TrayWnd", null);
}
}
}