123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- // Some interop code taken from Mike Marshall's AnyForm
- using System;
- using System.Drawing;
- using System.Runtime.InteropServices;
- namespace Hardcodet.Wpf.TaskbarNotification.Interop
- {
- public class AppBarInfo
- {
- [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 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 = 0x00000005;
- // SystemParametersInfo constants
- private const uint SPI_GETWORKAREA = 0x0030;
- private APPBARDATA m_data;
- public ScreenEdge Edge
- {
- get { return (ScreenEdge) m_data.uEdge; }
- }
- public Rectangle WorkArea
- {
- get { return GetRectangle(m_data.rc); }
- }
- 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 = new APPBARDATA();
- m_data.cbSize = (uint) Marshal.SizeOf(m_data.GetType());
- IntPtr hWnd = FindWindow(strClassName, strWindowName);
- if (hWnd != IntPtr.Zero)
- {
- uint uResult = SHAppBarMessage(ABM_GETTASKBARPOS, ref m_data);
- if (uResult != 1)
- {
- throw new Exception("Failed to communicate with the given AppBar");
- }
- }
- else
- {
- throw new Exception("Failed to find an AppBar that matched the given criteria");
- }
- }
- public void GetSystemTaskBarPosition()
- {
- GetPosition("Shell_TrayWnd", null);
- }
- public enum ScreenEdge
- {
- Undefined = -1,
- Left = ABE_LEFT,
- Top = ABE_TOP,
- Right = ABE_RIGHT,
- Bottom = ABE_BOTTOM
- }
- [StructLayout(LayoutKind.Sequential)]
- private struct APPBARDATA
- {
- public uint cbSize;
- public IntPtr hWnd;
- public uint uCallbackMessage;
- public uint 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;
- }
- }
- }
|