@@ -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}
0 commit comments