Skip to content

Commit 7df0b7a

Browse files
committed
Listen to all possible size change events...
1 parent bb4d31b commit 7df0b7a

5 files changed

Lines changed: 18 additions & 39 deletions

File tree

.vs/TaskbarHook/v15/.suo

-15 KB
Binary file not shown.

TaskbarHook/Rectangle.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,10 @@ public struct Rectangle
99
public int Top; // y position of upper-left corner
1010
public int Right; // x position of lower-right corner
1111
public int Bottom; // y position of lower-right corner
12+
13+
public bool Equals(Rectangle rectangle) => Left == rectangle.Left &&
14+
Right == rectangle.Right &&
15+
Top == rectangle.Top &&
16+
Bottom == rectangle.Bottom;
1217
}
1318
}

TaskbarHook/TaskBarFactory.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,11 @@ public static Taskbar GetTaskbar()
3232
return Taskbar.Instance;
3333

3434
IntPtr taskbarHandle = TaskBarHandle;
35-
IntPtr sysPageHandle = SysPagerHandle;
3635

3736
if (taskbarHandle == IntPtr.Zero)
3837
throw new PlatformNotSupportedException($"The TaskBar cound't be obtained.");
3938

40-
Taskbar.CreateAndInitialize(taskbarHandle, sysPageHandle);
39+
Taskbar.CreateAndInitialize(taskbarHandle);
4140
return GetTaskbar();
4241
}
4342
}

TaskbarHook/Taskbar.cs

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,28 @@ namespace TaskbarHook
77
public class Taskbar : IDisposable
88
{
99
private static WinEventDelegate taskbarResizeDelegate = new WinEventDelegate(TaskBarResizeEvent);
10-
private static WinEventDelegate sysPageResizeDelegate = new WinEventDelegate(SysPageResizeEvent);
1110

1211
private Taskbar() { }
1312

14-
internal static void CreateAndInitialize(IntPtr taskbarHandle, IntPtr sysPageHandle)
13+
internal static void CreateAndInitialize(IntPtr taskbarHandle)
1514
{
1615
Instance = new Taskbar();
1716
Instance.Handle = taskbarHandle;
18-
Instance.SysPageHandle = sysPageHandle;
1917
Instance.Rectangle = User32.GetWindowRectangle(Instance.Handle);
20-
Instance.SysPageRectangle = User32.GetWindowRectangle(Instance.SysPageHandle);
2118
Instance.TaskbarResizeHandle = User32.RegisterWindowSizeChangeEvent(Instance.Handle, taskbarResizeDelegate);
22-
Instance.SysPageResizeHandle = User32.RegisterWindowElementAdded(Instance.SysPageHandle, sysPageResizeDelegate);
2319
}
2420

2521
internal static Taskbar Instance { get; private set; }
2622

2723
public IntPtr Handle { get; private set; }
2824

29-
private IntPtr SysPageHandle { get; set; }
30-
31-
private IntPtr TaskbarResizeHandle { get; set; }
32-
33-
private IntPtr SysPageResizeHandle { get; set; }
34-
3525
public Rectangle Rectangle { get; private set; }
3626

37-
private Rectangle SysPageRectangle { get; set; }
27+
public async Task<TaskbarElement> AddToTaskbar() => await AddToTaskbar(Process.GetCurrentProcess());
3828

3929
public Action SizeChanged { get; set; }
4030

41-
public async Task<TaskbarElement> AddToTaskbar() => await AddToTaskbar(Process.GetCurrentProcess());
31+
private IntPtr TaskbarResizeHandle { get; set; }
4232

4333
public async Task<TaskbarElement> AddToTaskbar(Process process)
4434
{
@@ -53,29 +43,14 @@ public async Task<TaskbarElement> AddToTaskbar(Process process)
5343

5444
private static void TaskBarResizeEvent(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
5545
{
56-
Instance.Rectangle = User32.GetWindowRectangle(Instance.Handle);
57-
Instance?.SizeChanged?.Invoke();
58-
}
59-
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;
46+
var currentRectangle = User32.GetWindowRectangle(Instance.Handle);
47+
if (currentRectangle.Equals(Instance.Rectangle))
48+
return;
6749

68-
if (width != cwidth || height != cheight)
69-
{
70-
Instance.SysPageRectangle = currentIconTrayRectangle;
71-
TaskBarResizeEvent(hWinEventHook, eventType, hwnd, idObject, idChild, dwEventThread, dwmsEventTime);
72-
}
50+
Instance.Rectangle = currentRectangle;
51+
Instance?.SizeChanged?.Invoke();
7352
}
7453

75-
public void Dispose()
76-
{
77-
User32.UnRegisterWindowSizeChangeEvent(TaskbarResizeHandle);
78-
User32.UnRegisterWindowSizeChangeEvent(SysPageResizeHandle);
79-
}
54+
public void Dispose() => User32.UnRegisterWindowSizeChangeEvent(TaskbarResizeHandle);
8055
}
8156
}

TaskbarHook/User32.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ namespace TaskbarHook
55
{
66
internal static class User32
77
{
8-
private const uint EVENT_SYSTEM_MOVESIZESTART = 0x000A;
9-
private const uint EVENT_SYSTEM_MOVESIZEEND = 0x000B;
8+
//private const uint EVENT_SYSTEM_MOVESIZESTART = 0x000A;
9+
//private const uint EVENT_SYSTEM_MOVESIZEEND = 0x000B;
1010
private const uint WINEVENT_OUTOFCONTEXT = 0;
1111

1212
#region DLLImports
@@ -56,7 +56,7 @@ internal static IntPtr RegisterWindowSizeChangeEvent(IntPtr handle, WinEventDele
5656
uint process, thread = 0;
5757
thread = GetWindowThreadProcessId(handle, out process);
5858

59-
return SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART, EVENT_SYSTEM_MOVESIZEEND, IntPtr.Zero, delegateCallback, process, thread, WINEVENT_OUTOFCONTEXT);
59+
return SetWinEventHook(0x00001, 0x7FFFF, IntPtr.Zero, delegateCallback, process, thread, WINEVENT_OUTOFCONTEXT);
6060
}
6161

6262
internal static IntPtr RegisterWindowElementAdded(IntPtr handle, WinEventDelegate delegateCallback)

0 commit comments

Comments
 (0)