@@ -41,6 +41,7 @@ struct StartElement
4141 CString type;
4242 CString name;
4343 bool visibilityOverride;
44+ bool opacityOverride;
4445 bool hitTestOverride;
4546 bool startControlResolved;
4647 bool isStartControl;
@@ -50,6 +51,7 @@ struct StartElement
5051 {
5152 parent = 0 ;
5253 visibilityOverride = false ;
54+ opacityOverride = false ;
5355 hitTestOverride = false ;
5456 startControlResolved = false ;
5557 isStartControl = false ;
@@ -265,8 +267,9 @@ class CWin11StartButtonTap: public IObjectWithSite, public IVisualTreeServiceCal
265267 auto it = m_Elements.find (element.Handle );
266268 if (it != m_Elements.end ())
267269 {
268- interesting = it->second .visibilityOverride || it->second .hitTestOverride ||
269- it->second .isStartControl || IsStartControlCandidate (it->second );
270+ interesting = it->second .visibilityOverride || it->second .opacityOverride ||
271+ it->second .hitTestOverride || it->second .isStartControl ||
272+ IsStartControlCandidate (it->second );
270273 bool wasPrimary = element.Handle == m_PrimaryStart;
271274 m_Elements.erase (it);
272275 if (wasPrimary)
@@ -284,6 +287,7 @@ class CWin11StartButtonTap: public IObjectWithSite, public IVisualTreeServiceCal
284287 if (previous != m_Elements.end ())
285288 {
286289 record.visibilityOverride = previous->second .visibilityOverride ;
290+ record.opacityOverride = previous->second .opacityOverride ;
287291 record.hitTestOverride = previous->second .hitTestOverride ;
288292 record.startControlResolved = previous->second .startControlResolved ;
289293 record.isStartControl = previous->second .isStartControl ;
@@ -627,14 +631,16 @@ class CWin11StartButtonTap: public IObjectWithSite, public IVisualTreeServiceCal
627631 return m_Visual->ClearProperty (handle, index);
628632 }
629633
630- void SetOverrideFlags ( InstanceHandle handle, bool *visibility, bool *hitTest )
634+ void SetOverrideFlags ( InstanceHandle handle, bool *visibility, bool *opacity, bool * hitTest )
631635 {
632636 EnterCriticalSection (&m_Lock);
633637 auto it = m_Elements.find (handle);
634638 if (it != m_Elements.end ())
635639 {
636640 if (visibility)
637641 it->second .visibilityOverride = *visibility;
642+ if (opacity)
643+ it->second .opacityOverride = *opacity;
638644 if (hitTest)
639645 it->second .hitTestOverride = *hitTest;
640646 }
@@ -687,23 +693,49 @@ class CWin11StartButtonTap: public IObjectWithSite, public IVisualTreeServiceCal
687693 bool target = allTaskbars || !primaryStart || handle == primaryStart;
688694 if (enabled && target)
689695 {
696+ // Hide the verified Start control itself rather than depending
697+ // on the internal glyph subtree. Opacity preserves the taskbar
698+ // layout slot while remaining stable if Microsoft changes the
699+ // icon implementation on a newer Windows build.
700+ if (!record.opacityOverride )
701+ {
702+ HRESULT hr = SetPropertyText (handle, L" Opacity" , L" 0" );
703+ if (SUCCEEDED (hr))
704+ {
705+ bool value = true ;
706+ SetOverrideFlags (handle, NULL , &value, NULL );
707+ }
708+ }
709+
690710 if (!record.hitTestOverride )
691711 {
692712 HRESULT hr = SetPropertyText (handle, L" IsHitTestVisible" , L" False" );
693713 if (SUCCEEDED (hr))
694714 {
695715 bool value = true ;
696- SetOverrideFlags (handle, NULL , &value);
716+ SetOverrideFlags (handle, NULL , NULL , &value);
697717 }
698718 }
699719 }
700- else if (record. hitTestOverride )
720+ else
701721 {
702- HRESULT hr = ClearPropertyByName (handle, L" IsHitTestVisible" );
703- if (SUCCEEDED (hr))
722+ if (record.opacityOverride )
704723 {
705- bool value = false ;
706- SetOverrideFlags (handle, NULL , &value);
724+ HRESULT hr = ClearPropertyByName (handle, L" Opacity" );
725+ if (SUCCEEDED (hr))
726+ {
727+ bool value = false ;
728+ SetOverrideFlags (handle, NULL , &value, NULL );
729+ }
730+ }
731+ if (record.hitTestOverride )
732+ {
733+ HRESULT hr = ClearPropertyByName (handle, L" IsHitTestVisible" );
734+ if (SUCCEEDED (hr))
735+ {
736+ bool value = false ;
737+ SetOverrideFlags (handle, NULL , NULL , &value);
738+ }
707739 }
708740 }
709741 continue ;
@@ -725,7 +757,7 @@ class CWin11StartButtonTap: public IObjectWithSite, public IVisualTreeServiceCal
725757 if (SUCCEEDED (hr))
726758 {
727759 bool value = true ;
728- SetOverrideFlags (handle, &value, NULL );
760+ SetOverrideFlags (handle, &value, NULL , NULL );
729761 }
730762 }
731763 }
@@ -735,7 +767,7 @@ class CWin11StartButtonTap: public IObjectWithSite, public IVisualTreeServiceCal
735767 if (SUCCEEDED (hr))
736768 {
737769 bool value = false ;
738- SetOverrideFlags (handle, &value, NULL );
770+ SetOverrideFlags (handle, &value, NULL , NULL );
739771 }
740772 }
741773 }
0 commit comments