@@ -19,6 +19,7 @@ public class AppBarManager : IDisposable
1919
2020 public List < AppBarWindow > AppBars { get ; } = new List < AppBarWindow > ( ) ;
2121 public List < AppBarWindow > AutoHideBars { get ; } = new List < AppBarWindow > ( ) ;
22+ public List < AppBarWindow > OverlappingBars { get ; } = new List < AppBarWindow > ( ) ;
2223
2324 public AppBarManager ( ExplorerHelper explorerHelper )
2425 {
@@ -213,6 +214,26 @@ public void UnregisterAutoHideBar(AppBarWindow window)
213214 AutoHideBars . Remove ( window ) ;
214215 }
215216
217+ public void RegisterOverlappingBar ( AppBarWindow window )
218+ {
219+ if ( OverlappingBars . Contains ( window ) )
220+ {
221+ return ;
222+ }
223+
224+ OverlappingBars . Add ( window ) ;
225+ }
226+
227+ public void UnregisterOverlappingBar ( AppBarWindow window )
228+ {
229+ if ( ! OverlappingBars . Contains ( window ) )
230+ {
231+ return ;
232+ }
233+
234+ OverlappingBars . Remove ( window ) ;
235+ }
236+
216237 public int RegisterBar ( AppBarWindow abWindow )
217238 {
218239 lock ( appBarLock )
@@ -409,6 +430,56 @@ public Rect GetWorkArea(AppBarScreen screen, bool edgeBarsOnly, bool enabledBars
409430 }
410431 }
411432
433+ if ( ! enabledBarsOnly )
434+ {
435+ foreach ( var window in AutoHideBars )
436+ {
437+ if ( window . Screen . DeviceName == screen . DeviceName &&
438+ window . Handle != hWndIgnore &&
439+ ( window . RequiresScreenEdge || ! edgeBarsOnly ) )
440+ {
441+ switch ( window . AppBarEdge )
442+ {
443+ case AppBarEdge . Left :
444+ leftEdgeWindowWidth += window . WindowRect . Width ;
445+ break ;
446+ case AppBarEdge . Right :
447+ rightEdgeWindowWidth += window . WindowRect . Width ;
448+ break ;
449+ case AppBarEdge . Bottom :
450+ bottomEdgeWindowHeight += window . WindowRect . Height ;
451+ break ;
452+ case AppBarEdge . Top :
453+ topEdgeWindowHeight += window . WindowRect . Height ;
454+ break ;
455+ }
456+ }
457+ }
458+ foreach ( var window in OverlappingBars )
459+ {
460+ if ( window . Screen . DeviceName == screen . DeviceName &&
461+ window . Handle != hWndIgnore &&
462+ ( window . RequiresScreenEdge || ! edgeBarsOnly ) )
463+ {
464+ switch ( window . AppBarEdge )
465+ {
466+ case AppBarEdge . Left :
467+ leftEdgeWindowWidth += window . WindowRect . Width ;
468+ break ;
469+ case AppBarEdge . Right :
470+ rightEdgeWindowWidth += window . WindowRect . Width ;
471+ break ;
472+ case AppBarEdge . Bottom :
473+ bottomEdgeWindowHeight += window . WindowRect . Height ;
474+ break ;
475+ case AppBarEdge . Top :
476+ topEdgeWindowHeight += window . WindowRect . Height ;
477+ break ;
478+ }
479+ }
480+ }
481+ }
482+
412483 rc . Top = screen . Bounds . Top + topEdgeWindowHeight ;
413484 rc . Bottom = screen . Bounds . Bottom - bottomEdgeWindowHeight ;
414485 rc . Left = screen . Bounds . Left + leftEdgeWindowWidth ;
0 commit comments