Skip to content

Commit bb4d31b

Browse files
committed
IconTrayHandle, SysPagerHandle, InfoSectionHandle added. TaskBar resize event triggered on InfoSection resize events.
1 parent 80a6eaa commit bb4d31b

5 files changed

Lines changed: 57 additions & 10 deletions

File tree

.vs/TaskbarHook/v15/.suo

8 KB
Binary file not shown.

TaskbarHook/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,5 @@
3232
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
3333
// indem Sie "*" wie unten gezeigt eingeben:
3434
// [assembly: AssemblyVersion("1.0.*")]
35-
[assembly: AssemblyVersion("1.1.0.1")]
36-
[assembly: AssemblyFileVersion("1.1.0.1")]
35+
[assembly: AssemblyVersion("1.2.0.1")]
36+
[assembly: AssemblyFileVersion("1.2.0.1")]

TaskbarHook/TaskBarFactory.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@ public static class TaskBarFactory
66
{
77
private const string SHELLTRAY = "Shell_traywnd";
88
private const string REBAR = "ReBarWindow32";
9+
private const string SYSPAGER = "SysPager";
910

1011
public static IntPtr ShellTrayHandle => User32.GetWindow(SHELLTRAY);
1112

1213
public static IntPtr ReBarWindowHandle => User32.GetWindow(ShellTrayHandle, REBAR);
1314

15+
public static IntPtr IconTrayHandle => User32.GetNextWindow(ReBarWindowHandle);
16+
17+
public static IntPtr SysPagerHandle => User32.GetWindow(IconTrayHandle, SYSPAGER);
18+
19+
public static IntPtr InfoSectionHandle => User32.GetFirstWindowChild(SysPagerHandle);
20+
1421
public static IntPtr TaskBarHandle => User32.GetFirstWindowChild(User32.GetFirstWindowChild(ReBarWindowHandle));
1522

1623
/// <summary>
@@ -25,11 +32,12 @@ public static Taskbar GetTaskbar()
2532
return Taskbar.Instance;
2633

2734
IntPtr taskbarHandle = TaskBarHandle;
35+
IntPtr sysPageHandle = SysPagerHandle;
2836

2937
if (taskbarHandle == IntPtr.Zero)
3038
throw new PlatformNotSupportedException($"The TaskBar cound't be obtained.");
3139

32-
Taskbar.CreateAndInitialize(taskbarHandle);
40+
Taskbar.CreateAndInitialize(taskbarHandle, sysPageHandle);
3341
return GetTaskbar();
3442
}
3543
}

TaskbarHook/Taskbar.cs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,36 @@ namespace TaskbarHook
66
{
77
public class Taskbar : IDisposable
88
{
9-
private static WinEventDelegate eventDelegate = new WinEventDelegate(TaskBarResizeEvent);
9+
private static WinEventDelegate taskbarResizeDelegate = new WinEventDelegate(TaskBarResizeEvent);
10+
private static WinEventDelegate sysPageResizeDelegate = new WinEventDelegate(SysPageResizeEvent);
1011

1112
private Taskbar() { }
1213

13-
internal static void CreateAndInitialize(IntPtr handle)
14+
internal static void CreateAndInitialize(IntPtr taskbarHandle, IntPtr sysPageHandle)
1415
{
1516
Instance = new Taskbar();
16-
Instance.Handle = handle;
17+
Instance.Handle = taskbarHandle;
18+
Instance.SysPageHandle = sysPageHandle;
1719
Instance.Rectangle = User32.GetWindowRectangle(Instance.Handle);
18-
Instance.ResizeHandle = User32.RegisterWindowSizeChangeEvent(Instance.Handle, eventDelegate);
20+
Instance.SysPageRectangle = User32.GetWindowRectangle(Instance.SysPageHandle);
21+
Instance.TaskbarResizeHandle = User32.RegisterWindowSizeChangeEvent(Instance.Handle, taskbarResizeDelegate);
22+
Instance.SysPageResizeHandle = User32.RegisterWindowElementAdded(Instance.SysPageHandle, sysPageResizeDelegate);
1923
}
2024

2125
internal static Taskbar Instance { get; private set; }
2226

2327
public IntPtr Handle { get; private set; }
2428

25-
private IntPtr ResizeHandle { get; set; }
29+
private IntPtr SysPageHandle { get; set; }
30+
31+
private IntPtr TaskbarResizeHandle { get; set; }
32+
33+
private IntPtr SysPageResizeHandle { get; set; }
2634

2735
public Rectangle Rectangle { get; private set; }
2836

37+
private Rectangle SysPageRectangle { get; set; }
38+
2939
public Action SizeChanged { get; set; }
3040

3141
public async Task<TaskbarElement> AddToTaskbar() => await AddToTaskbar(Process.GetCurrentProcess());
@@ -44,9 +54,28 @@ public async Task<TaskbarElement> AddToTaskbar(Process process)
4454
private static void TaskBarResizeEvent(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
4555
{
4656
Instance.Rectangle = User32.GetWindowRectangle(Instance.Handle);
47-
Instance?.SizeChanged();
57+
Instance?.SizeChanged?.Invoke();
4858
}
4959

50-
public void Dispose() => User32.UnRegisterWindowSizeChangeEvent(ResizeHandle);
60+
private static void SysPageResizeEvent(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
61+
{
62+
var currentIconTrayRectangle = User32.GetWindowRectangle(Instance.SysPageHandle);
63+
int width = currentIconTrayRectangle.Right - currentIconTrayRectangle.Left;
64+
int height = currentIconTrayRectangle.Bottom - currentIconTrayRectangle.Top;
65+
int cwidth = Instance.SysPageRectangle.Right - Instance.SysPageRectangle.Left;
66+
int cheight = Instance.SysPageRectangle.Bottom - Instance.SysPageRectangle.Top;
67+
68+
if (width != cwidth || height != cheight)
69+
{
70+
Instance.SysPageRectangle = currentIconTrayRectangle;
71+
TaskBarResizeEvent(hWinEventHook, eventType, hwnd, idObject, idChild, dwEventThread, dwmsEventTime);
72+
}
73+
}
74+
75+
public void Dispose()
76+
{
77+
User32.UnRegisterWindowSizeChangeEvent(TaskbarResizeHandle);
78+
User32.UnRegisterWindowSizeChangeEvent(SysPageResizeHandle);
79+
}
5180
}
5281
}

TaskbarHook/User32.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ internal static IntPtr RegisterWindowSizeChangeEvent(IntPtr handle, WinEventDele
5959
return SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, IntPtr.Zero, delegateCallback, process, thread, WINEVENT_OUTOFCONTEXT);
6060
}
6161

62+
internal static IntPtr RegisterWindowElementAdded(IntPtr handle, WinEventDelegate delegateCallback)
63+
{
64+
uint process, thread = 0;
65+
thread = GetWindowThreadProcessId(handle, out process);
66+
67+
return SetWinEventHook(0x8001, 0x8001, IntPtr.Zero, delegateCallback, process, thread, WINEVENT_OUTOFCONTEXT);
68+
}
69+
6270
internal static bool UnRegisterWindowSizeChangeEvent(IntPtr hoockHandle) => UnhookWinEvent(hoockHandle);
6371

6472
internal static IntPtr GetWindowParent(IntPtr handle) => GetParent(handle);
@@ -69,6 +77,8 @@ internal static IntPtr RegisterWindowSizeChangeEvent(IntPtr handle, WinEventDele
6977

7078
internal static IntPtr GetFirstWindowChild(IntPtr parentHandle) => GetWindow(parentHandle, 5);
7179

80+
internal static IntPtr GetNextWindow(IntPtr handle) => GetWindow(handle, 2);
81+
7282
internal static Rectangle GetWindowRectangle(IntPtr handle)
7383
{
7484
Rectangle rectangle = new Rectangle();

0 commit comments

Comments
 (0)