Statistics
| Branch: | Revision:

root / trunk / NotifyIconWpf / Interop / TrayInfo.cs @ 049333d2

History | View | Annotate | Download (3.9 kB)

1 9bae55d1 Panagiotis Kanavos
// Some interop code taken from Mike Marshall's AnyForm
2 9bae55d1 Panagiotis Kanavos
3 9bae55d1 Panagiotis Kanavos
using System;
4 9bae55d1 Panagiotis Kanavos
using System.Drawing;
5 9bae55d1 Panagiotis Kanavos
using System.Runtime.InteropServices;
6 9bae55d1 Panagiotis Kanavos
7 9bae55d1 Panagiotis Kanavos
8 9bae55d1 Panagiotis Kanavos
namespace Hardcodet.Wpf.TaskbarNotification.Interop
9 9bae55d1 Panagiotis Kanavos
{
10 9bae55d1 Panagiotis Kanavos
  /// <summary>
11 9bae55d1 Panagiotis Kanavos
  /// Resolves the current tray position.
12 9bae55d1 Panagiotis Kanavos
  /// </summary>
13 9bae55d1 Panagiotis Kanavos
  public static class TrayInfo
14 9bae55d1 Panagiotis Kanavos
  {
15 9bae55d1 Panagiotis Kanavos
    /// <summary>
16 9bae55d1 Panagiotis Kanavos
    /// Gets the position of the system tray.
17 9bae55d1 Panagiotis Kanavos
    /// </summary>
18 9bae55d1 Panagiotis Kanavos
    /// <returns>Tray coordinates.</returns>
19 9bae55d1 Panagiotis Kanavos
    public static Point GetTrayLocation()
20 9bae55d1 Panagiotis Kanavos
    {
21 9bae55d1 Panagiotis Kanavos
      var info = new AppBarInfo();
22 9bae55d1 Panagiotis Kanavos
      info.GetSystemTaskBarPosition();
23 9bae55d1 Panagiotis Kanavos
24 9bae55d1 Panagiotis Kanavos
      Rectangle rcWorkArea = info.WorkArea;
25 9bae55d1 Panagiotis Kanavos
26 9bae55d1 Panagiotis Kanavos
      int x = 0, y = 0;
27 9bae55d1 Panagiotis Kanavos
      if (info.Edge == AppBarInfo.ScreenEdge.Left)
28 9bae55d1 Panagiotis Kanavos
      {
29 9bae55d1 Panagiotis Kanavos
        x = rcWorkArea.Left + 2;
30 9bae55d1 Panagiotis Kanavos
        y = rcWorkArea.Bottom;
31 9bae55d1 Panagiotis Kanavos
      }
32 9bae55d1 Panagiotis Kanavos
      else if (info.Edge == AppBarInfo.ScreenEdge.Bottom)
33 9bae55d1 Panagiotis Kanavos
      {
34 9bae55d1 Panagiotis Kanavos
        x = rcWorkArea.Right;
35 9bae55d1 Panagiotis Kanavos
        y = rcWorkArea.Bottom;
36 9bae55d1 Panagiotis Kanavos
      }
37 9bae55d1 Panagiotis Kanavos
      else if (info.Edge == AppBarInfo.ScreenEdge.Top)
38 9bae55d1 Panagiotis Kanavos
      {
39 9bae55d1 Panagiotis Kanavos
        x = rcWorkArea.Right;
40 9bae55d1 Panagiotis Kanavos
        y = rcWorkArea.Top;
41 9bae55d1 Panagiotis Kanavos
      }
42 9bae55d1 Panagiotis Kanavos
      else if (info.Edge == AppBarInfo.ScreenEdge.Right)
43 9bae55d1 Panagiotis Kanavos
      {
44 9bae55d1 Panagiotis Kanavos
        x = rcWorkArea.Right;
45 9bae55d1 Panagiotis Kanavos
        y = rcWorkArea.Bottom;
46 9bae55d1 Panagiotis Kanavos
      }
47 9bae55d1 Panagiotis Kanavos
48 9bae55d1 Panagiotis Kanavos
      return new Point { X = x, Y = y};
49 9bae55d1 Panagiotis Kanavos
    }
50 9bae55d1 Panagiotis Kanavos
  }
51 9bae55d1 Panagiotis Kanavos
52 9bae55d1 Panagiotis Kanavos
53 9bae55d1 Panagiotis Kanavos
54 9bae55d1 Panagiotis Kanavos
55 9bae55d1 Panagiotis Kanavos
  internal class AppBarInfo
56 9bae55d1 Panagiotis Kanavos
  {
57 9bae55d1 Panagiotis Kanavos
58 9bae55d1 Panagiotis Kanavos
    [DllImport("user32.dll")]
59 9bae55d1 Panagiotis Kanavos
    private static extern IntPtr FindWindow(String lpClassName, String lpWindowName);
60 9bae55d1 Panagiotis Kanavos
61 9bae55d1 Panagiotis Kanavos
    [DllImport("shell32.dll")]
62 9bae55d1 Panagiotis Kanavos
    private static extern UInt32 SHAppBarMessage(UInt32 dwMessage, ref APPBARDATA data);
63 9bae55d1 Panagiotis Kanavos
64 9bae55d1 Panagiotis Kanavos
    [DllImport("user32.dll")]
65 9bae55d1 Panagiotis Kanavos
    private static extern Int32 SystemParametersInfo(UInt32 uiAction, UInt32 uiParam,
66 9bae55d1 Panagiotis Kanavos
                                                     IntPtr pvParam, UInt32 fWinIni);
67 9bae55d1 Panagiotis Kanavos
68 9bae55d1 Panagiotis Kanavos
69 9bae55d1 Panagiotis Kanavos
    private const int ABE_BOTTOM = 3;
70 9bae55d1 Panagiotis Kanavos
    private const int ABE_LEFT = 0;
71 9bae55d1 Panagiotis Kanavos
    private const int ABE_RIGHT = 2;
72 9bae55d1 Panagiotis Kanavos
    private const int ABE_TOP = 1;
73 9bae55d1 Panagiotis Kanavos
74 9bae55d1 Panagiotis Kanavos
    private const int ABM_GETTASKBARPOS = 0x00000005;
75 9bae55d1 Panagiotis Kanavos
76 9bae55d1 Panagiotis Kanavos
    // SystemParametersInfo constants
77 9bae55d1 Panagiotis Kanavos
    private const UInt32 SPI_GETWORKAREA = 0x0030;
78 9bae55d1 Panagiotis Kanavos
79 9bae55d1 Panagiotis Kanavos
    private APPBARDATA m_data;
80 9bae55d1 Panagiotis Kanavos
81 9bae55d1 Panagiotis Kanavos
    public ScreenEdge Edge
82 9bae55d1 Panagiotis Kanavos
    {
83 9bae55d1 Panagiotis Kanavos
      get { return (ScreenEdge) m_data.uEdge; }
84 9bae55d1 Panagiotis Kanavos
    }
85 9bae55d1 Panagiotis Kanavos
86 9bae55d1 Panagiotis Kanavos
87 9bae55d1 Panagiotis Kanavos
    public Rectangle WorkArea
88 9bae55d1 Panagiotis Kanavos
    {
89 9bae55d1 Panagiotis Kanavos
      get
90 9bae55d1 Panagiotis Kanavos
      {
91 9bae55d1 Panagiotis Kanavos
        Int32 bResult = 0;
92 9bae55d1 Panagiotis Kanavos
        var rc = new RECT();
93 9bae55d1 Panagiotis Kanavos
        IntPtr rawRect = Marshal.AllocHGlobal(Marshal.SizeOf(rc));
94 9bae55d1 Panagiotis Kanavos
        bResult = SystemParametersInfo(SPI_GETWORKAREA, 0, rawRect, 0);
95 9bae55d1 Panagiotis Kanavos
        rc = (RECT) Marshal.PtrToStructure(rawRect, rc.GetType());
96 9bae55d1 Panagiotis Kanavos
97 9bae55d1 Panagiotis Kanavos
        if (bResult == 1)
98 9bae55d1 Panagiotis Kanavos
        {
99 9bae55d1 Panagiotis Kanavos
          Marshal.FreeHGlobal(rawRect);
100 9bae55d1 Panagiotis Kanavos
          return new Rectangle(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
101 9bae55d1 Panagiotis Kanavos
        }
102 9bae55d1 Panagiotis Kanavos
103 9bae55d1 Panagiotis Kanavos
        return new Rectangle(0, 0, 0, 0);
104 9bae55d1 Panagiotis Kanavos
      }
105 9bae55d1 Panagiotis Kanavos
    }
106 9bae55d1 Panagiotis Kanavos
107 9bae55d1 Panagiotis Kanavos
108 9bae55d1 Panagiotis Kanavos
109 9bae55d1 Panagiotis Kanavos
    public void GetPosition(string strClassName, string strWindowName)
110 9bae55d1 Panagiotis Kanavos
    {
111 9bae55d1 Panagiotis Kanavos
      m_data = new APPBARDATA();
112 9bae55d1 Panagiotis Kanavos
      m_data.cbSize = (UInt32) Marshal.SizeOf(m_data.GetType());
113 9bae55d1 Panagiotis Kanavos
114 9bae55d1 Panagiotis Kanavos
      IntPtr hWnd = FindWindow(strClassName, strWindowName);
115 9bae55d1 Panagiotis Kanavos
116 9bae55d1 Panagiotis Kanavos
      if (hWnd != IntPtr.Zero)
117 9bae55d1 Panagiotis Kanavos
      {
118 9bae55d1 Panagiotis Kanavos
        UInt32 uResult = SHAppBarMessage(ABM_GETTASKBARPOS, ref m_data);
119 9bae55d1 Panagiotis Kanavos
120 9bae55d1 Panagiotis Kanavos
        if (uResult != 1)
121 9bae55d1 Panagiotis Kanavos
        {
122 9bae55d1 Panagiotis Kanavos
          throw new Exception("Failed to communicate with the given AppBar");
123 9bae55d1 Panagiotis Kanavos
        }
124 9bae55d1 Panagiotis Kanavos
      }
125 9bae55d1 Panagiotis Kanavos
      else
126 9bae55d1 Panagiotis Kanavos
      {
127 9bae55d1 Panagiotis Kanavos
        throw new Exception("Failed to find an AppBar that matched the given criteria");
128 9bae55d1 Panagiotis Kanavos
      }
129 9bae55d1 Panagiotis Kanavos
    }
130 9bae55d1 Panagiotis Kanavos
131 9bae55d1 Panagiotis Kanavos
132 9bae55d1 Panagiotis Kanavos
    public void GetSystemTaskBarPosition()
133 9bae55d1 Panagiotis Kanavos
    {
134 9bae55d1 Panagiotis Kanavos
      GetPosition("Shell_TrayWnd", null);
135 9bae55d1 Panagiotis Kanavos
    }
136 9bae55d1 Panagiotis Kanavos
137 9bae55d1 Panagiotis Kanavos
138 9bae55d1 Panagiotis Kanavos
139 9bae55d1 Panagiotis Kanavos
140 9bae55d1 Panagiotis Kanavos
    public enum ScreenEdge
141 9bae55d1 Panagiotis Kanavos
    {
142 9bae55d1 Panagiotis Kanavos
      Undefined = -1,
143 9bae55d1 Panagiotis Kanavos
      Left = ABE_LEFT,
144 9bae55d1 Panagiotis Kanavos
      Top = ABE_TOP,
145 9bae55d1 Panagiotis Kanavos
      Right = ABE_RIGHT,
146 9bae55d1 Panagiotis Kanavos
      Bottom = ABE_BOTTOM
147 9bae55d1 Panagiotis Kanavos
    }
148 9bae55d1 Panagiotis Kanavos
149 9bae55d1 Panagiotis Kanavos
150 9bae55d1 Panagiotis Kanavos
    [StructLayout(LayoutKind.Sequential)]
151 9bae55d1 Panagiotis Kanavos
    private struct APPBARDATA
152 9bae55d1 Panagiotis Kanavos
    {
153 9bae55d1 Panagiotis Kanavos
      public UInt32 cbSize;
154 9bae55d1 Panagiotis Kanavos
      public IntPtr hWnd;
155 9bae55d1 Panagiotis Kanavos
      public UInt32 uCallbackMessage;
156 9bae55d1 Panagiotis Kanavos
      public UInt32 uEdge;
157 9bae55d1 Panagiotis Kanavos
      public RECT rc;
158 9bae55d1 Panagiotis Kanavos
      public Int32 lParam;
159 9bae55d1 Panagiotis Kanavos
    }
160 9bae55d1 Panagiotis Kanavos
161 9bae55d1 Panagiotis Kanavos
    [StructLayout(LayoutKind.Sequential)]
162 9bae55d1 Panagiotis Kanavos
    private struct RECT
163 9bae55d1 Panagiotis Kanavos
    {
164 9bae55d1 Panagiotis Kanavos
      public Int32 left;
165 9bae55d1 Panagiotis Kanavos
      public Int32 top;
166 9bae55d1 Panagiotis Kanavos
      public Int32 right;
167 9bae55d1 Panagiotis Kanavos
      public Int32 bottom;
168 9bae55d1 Panagiotis Kanavos
    }
169 9bae55d1 Panagiotis Kanavos
170 9bae55d1 Panagiotis Kanavos
  }
171 9bae55d1 Panagiotis Kanavos
}