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