Docs · internals
How TranslucentTB works
Windows has no supported way for an app to restyle the taskbar. TranslucentTB detects which taskbar you have and then takes one of two routes: on the classic taskbar it sets an undocumented window attribute; on the Windows 11 XAML taskbar it loads a small helper, ExplorerTAP, into Explorer through the XAML Diagnostics API. Everything here is read from the 2026.2 source (commit d4636e4).
On this page
Short answer
How does TranslucentTB make the taskbar transparent?
On Windows 10 it calls SetWindowCompositionAttribute on the taskbar window with an accent policy (clear, blur, acrylic). On Windows 11 22H2 and later the taskbar is drawn with XAML, so it loads ExplorerTAP.dll into Explorer, uses XAML Diagnostics to find the taskbar's background element, and replaces its brush. A separate state machine decides which look applies at each moment.
The parts of the app
The portable zip of 2026.2 contains exactly these files. Two of the DLLs run inside explorer.exe, the rest in TranslucentTB's own process.
| File | Size | What it does |
|---|---|---|
TranslucentTB.exe | 881 KB | The app: tray icon, settings, state machine |
Xaml.dll | 1.13 MB | The XAML UI: tray flyout, color picker, welcome page |
ExplorerTAP.dll | 566 KB | Loaded into Explorer on the Windows 11 XAML taskbar to swap its background brush |
ProgramLog.dll | 414 KB | Logging |
ExplorerHooks.dll | 207 KB | Loaded into Explorer to watch Task View and stop Explorer resetting the taskbar |
resources.pri | 116 KB | Translated strings and assets |
Assets\SplashScreen.jpeg | 163 KB | Splash image |
Assets\SplashScreen.scale-400.jpeg | 207 KB | Splash image, 400% scale |
The Store package has the same binaries. It also declares an app alias (ttb.exe), a startup task and one capability, runFullTrust, which every desktop app in an MSIX package needs. Resource use: the README describes it as "a few MB of RAM and almost no CPU". We have not measured it ourselves.
Step 1: which taskbar is this?
Every time Explorer starts or restarts, TranslucentTB classifies the main taskbar (TaskbarAttributeWorker::GetTaskbarType):
| Type | How it is detected | Where you see it | How the look is applied |
|---|---|---|---|
| Classic | Explorer has not loaded System32\Taskbar.dll | Windows 10; Windows 11 with a tool that restores the old taskbar (for example ExplorerPatcher) | SetWindowCompositionAttribute + ExplorerHooks |
| Mixed | Taskbar.dll loaded, two XAML islands in the taskbar window | Windows 11 21H2 (22000) and early 22H2 (22621) builds | SetWindowCompositionAttribute + ExplorerHooks |
| XAML | Taskbar.dll loaded, one XAML island | Windows 11 22H2 and later, including 23H2, 24H2 and 25H2 | ExplorerTAP brushes |
| Unknown | Anything else, or Explorer is still starting | For a moment after Explorer restarts | Nothing yet; it tries again on the next refresh |
You can see what TranslucentTB detected: choose Advanced › Dump dynamic state to log in the tray menu and look for Current taskbar type: in the log.
Step 2a: the classic route
SetWindowCompositionAttribute is an undocumented function in user32.dll that Windows itself uses for window effects. With the attribute WCA_ACCENT_POLICY it takes an accent state, flags and a color. TranslucentTB maps its accents like this:
| settings.json | Accent state sent | Notes |
|---|---|---|
normal | none | TranslucentTB sends the taskbar WM_DWMCOMPOSITIONCHANGED so it redraws its own default look |
opaque | ACCENT_ENABLE_GRADIENT (1) | Windows ignores the alpha |
clear | ACCENT_ENABLE_TRANSPARENTGRADIENT (2) | Color with alpha, no blur |
blur | ACCENT_ENABLE_BLURBEHIND (3) | Fixed blur strength; blur_radius is not used |
acrylic | ACCENT_ENABLE_ACRYLICBLURBEHIND (4) | An alpha of 0 is raised to 1, because acrylic misbehaves at exactly 0 |
The color is passed as a COLORREF-style value in ABGR byte order; settings.json stores it as #RRGGBBAA and TranslucentTB converts it.
Explorer resets that attribute on its own from time to time. So TranslucentTB installs ExplorerHooks.dll in Explorer with a window hook on the taskbar thread. It uses Microsoft Detours to wrap SetWindowCompositionAttribute inside Explorer: when Explorer tries to set an accent policy, the hook asks TranslucentTB's worker window first (with a 100 ms timeout, so a frozen TranslucentTB can't freeze Explorer) and swallows Explorer's call if TranslucentTB handles it. On Windows 10, ExplorerHooks also watches Task View from inside Explorer.
On the Mixed taskbar the same route is used. The Windows 11 border line (show_line) is handled separately: TranslucentTB hides a WorkerW child window (early 22621) or clips the inner XAML window by one pixel (22000). On the XAML taskbar, ExplorerTAP shows or hides the border element itself.
Step 2b: the Windows 11 route
The Windows 11 XAML taskbar ignores the accent policy: its background is a XAML element with its own brush. To change that brush, code has to run inside Explorer's XAML thread. TranslucentTB does it with the XAML Diagnostics API, the same API Visual Studio's Live Visual Tree uses to inspect running XAML apps. The API calls the injected component a TAP.
- Copy. Explorer cannot load a DLL from the protected
WindowsAppsfolder, so TranslucentTB first copiesExplorerTAP.dllandExplorerHooks.dllto the package'sTempStatefolder. The portable version copies them to%TEMP%\TranslucentTB, so you can still eject the drive it runs from. This is what the hiddencopy_dllssetting controls (default on). - Mark. It writes a 4-byte Detours payload into Explorer. The DLL checks for that marker when it loads, so it only does anything when it is inside the right Explorer.
- Load. A
WH_CALLWNDPROChook on the taskbar's thread makes Windows load the DLL into Explorer. (This replaced an older injection method in November 2024.) - Initialize. Inside Explorer, the DLL calls
InitializeXamlDiagnosticsExfromWindows.UI.Xaml.dll. XAML Diagnostics can only be initialized once per thread, so each attempt runs on a fresh thread with a new connection name (VisualDiagConnection1,2, …), up to 60 attempts 500 ms apart: at most 30 seconds. - Watch. XAML Diagnostics hands the DLL a site object. It watches the taskbar's visual tree, finds the background element of each taskbar, remembers its original brush and signals the
TTBTAP_Readyevent. - Connect. TranslucentTB waits up to 35 seconds for that event, fetches the
TaskbarAppearanceServiceCOM object and checks its version. 2026.2 expects TAP API version 4. - Paint. From then on TranslucentTB calls
SetTaskbarAppearance(solid or acrylic brush with your tint),SetTaskbarBlur(a Direct2D Gaussian blur with standard deviationblur_radius ÷ 3, plus your tint) orReturnTaskbarToDefaultAppearancefornormal.
If step 4 or 6 fails, the log gets the critical error Failed to initialize XAML Diagnostics. and TranslucentTB shows its "has encountered a fatal error and cannot continue executing" dialog. Causes and fixes: Troubleshooting.
Why updates sometimes need a restart
InitializeXamlDiagnosticsEx pins the DLL in Explorer for the life of that Explorer process: it can never be unloaded. After TranslucentTB updates, Explorer may still hold the old ExplorerTAP. That is why step 6 checks the version. On a mismatch you get:
Restarting Explorer is enough in practice, because the old DLL lives in Explorer's process. Since 2026.1 ExplorerTAP also listens for the TranslucentTB package being uninstalled, and since 2026.2 for it being updated; when either happens, it ends the Explorer process so the old DLL is released. Windows restarts Explorer straight away, which is why the taskbar briefly disappears during a TranslucentTB update or uninstall.
What happens when TranslucentTB exits or crashes
Right after connecting, TranslucentTB asks ExplorerTAP to watch its process (RestoreAllTaskbarsToDefaultWhenProcessDies). When TranslucentTB exits for any reason, crashes included, ExplorerTAP puts the original brushes back, so you are not left with a stuck transparent taskbar. On a normal exit TranslucentTB also returns every taskbar to its stock look itself, which covers the classic route.
Step 3: knowing what is on screen
The look depends on what is happening: an open window, a maximized one, Start, Search, Task View, battery saver. TranslucentTB learns about each from a different Windows source:
| Signal | Source in 2026.2 |
|---|---|
| Windows opening, closing, moving, maximizing, minimizing, retitling | SetWinEventHook (out of context) for object create/destroy, show/hide, cloak/uncloak, minimize start/end, location, name, parent and z-order changes, and foreground changes |
| Aero Peek | EVENT_SYSTEM_PEEKSTART / PEEKEND |
| Start menu | IAppVisibility launcher-visibility notifications, per monitor |
| Search | Windows 11: the shell's ShellViewCoordinator for Search and "find in Start". Windows 10: the search experience manager (SearchApp on 2004 and later, Cortana before) |
| Task View | Windows 11: ShellViewCoordinator for Task View. Windows 10: a monitor inside ExplorerHooks |
| Battery saver | RegisterPowerSettingNotification with GUID_POWER_SAVING_STATUS |
| Explorer restarts | The TaskbarCreated broadcast message |
Each time something changes, the worker re-runs one function, GetConfig, for every monitor's taskbar. It walks a fixed priority list and returns the first state that is enabled and true: battery saver, Task View, Aero Peek (desktop look), Start, Search, maximized window, visible window, desktop. See Dynamic modes for the details and an interactive version.
Built-in safety nets
- Explorer crash guard. If Explorer restarts twice within 30 seconds, TranslucentTB assumes something is wrong (often a clash with another shell mod), shows Windows Explorer restarted twice in the last 30 seconds! and exits instead of risking a crash loop. The development branch after 2026.2 adds a hidden setting,
disable_explorer_crash_detection, to turn this off. - No freezing Explorer. The ExplorerHooks call into TranslucentTB times out after 100 ms and aborts if TranslucentTB is hung.
- Reset on demand. Ctrl+Alt+Shift+F1 or Reset dynamic state clears all tracked state, finds the taskbars again and reconnects. See Tray menu.
Process hardening
Before doing anything else, TranslucentTB.exe turns on these Windows protections for its own process (HardenProcess in main.cpp):
| Protection | Windows API | Effect |
|---|---|---|
| Safe DLL search mode | SetSearchPathMode | The current folder is searched later for DLLs, which makes DLL planting harder |
| Terminate on heap corruption | HeapSetInformation | The process ends instead of continuing with a corrupt heap |
| Strict handle checks | ProcessStrictHandleCheckPolicy | Using an invalid handle raises an exception |
| Force relocate images | ProcessASLRPolicy | ASLR applies to every loaded image; images without relocation data are refused |
| Disable extension points | ProcessExtensionPointDisablePolicy | Legacy injection points such as AppInit DLLs are ignored |
| Binary signature policy | ProcessSignaturePolicy (opt-in) | Restricts which signed images the process may load |
| Prefer System32 images | ProcessImageLoadPolicy | System DLLs are loaded from System32 first |
| No swallowed timer exceptions | SetUserObjectInformation | Crashes in timer callbacks are not silently ignored |
These protect TranslucentTB's own process. They do not apply to Explorer, where ExplorerTAP and ExplorerHooks run. What that means for you, along with signatures and antivirus reports: Is TranslucentTB safe?
FAQ
What is ExplorerTAP.dll?
explorer.exe on the Windows 11 XAML taskbar. It is loaded through the XAML Diagnostics API, finds the taskbar's background element and swaps its brush for a solid, acrylic or blur brush. It is 566 KB in 2026.2 and signed like the rest of the package.What is XAML Diagnostics?
InitializeXamlDiagnosticsEx) meant for developer tools that inspect a running XAML app's visual tree. TranslucentTB uses it because it is the only way to reach the Windows 11 taskbar's XAML elements from outside Explorer.Does TranslucentTB modify system files?
Why does the taskbar flash when TranslucentTB updates?
Why does blur on Windows 10 ignore blur_radius?
blur_radius only exists for the XAML route, where TranslucentTB draws the blur itself.Keep going
Something wrong or out of date? Email hello@translucenttb.dev and we will fix it.