Skip to content

Commit ea4c4e9

Browse files
committed
Hide native Start control by opacity
1 parent 192b2e3 commit ea4c4e9

1 file changed

Lines changed: 43 additions & 11 deletions

File tree

‎Src/StartMenu/StartMenuDLL/Win11StartButton.cpp‎

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)