🇬🇧 English · 🇩🇪 Deutsch
A clickable desktop bar for the virtual desktops of Windows 11. It sits in the lower left of the taskbar, one button per virtual desktop, labelled with the desktop's Windows name. Click to switch there; the active desktop is highlighted.
Built by Henning Pähtz as a lean tool for per-project time tracking: one desktop = one client, always a single click away.
I organise my projects and my time tracking around virtual desktops: one desktop per project, with exactly the windows and the layout I need for it. Switching desktops serves two purposes at once. First, it swaps the entire working context: every window of the project is instantly there. Second, ManicTime, which I use to track my working hours, records the active desktop. In the daily view I can later see precisely when and how long I worked on which project.
For this to stay clean, I need to see at any moment which desktop I am on. In the past I often ran a task on the wrong desktop by accident, which skews the later evaluation and means rework. DeskTabs solves that: a permanently visible bar shows the active desktop, and a direct click switches to it instead of cycling through the Windows shortcut. So I always land in the right context, and the time is attributed to the right project.
- Live names from Windows: the button labels come straight from the desktops you named in Windows (Task View). Nothing is maintained twice.
- Dynamic: add or remove a desktop in Windows → the bar adapts automatically within ~1.2 s (or via Tray → "Rebuild bar").
- Native switching: a click emulates
Win+Ctrl+Arrow. Windows stay put on their desktops (unlikeGoToDesktopNumber, which drags the focused window along on 24H2/25H2). - Visible on all desktops: the window is pinned to every desktop.
- Light/Dark automatic: follows the Windows theme (taskbar brightness), switchable or fixed.
- Index prefix: "3 · ProjectName" (can be disabled).
- Colour coding: a thin colour bar per desktop (tab-indicator style, can be disabled, overridable per desktop).
- Hover effect: the button under the mouse lightens up.
- Click on the active desktop: opens Task View (Win+Tab).
- Fullscreen auto-hide: hides itself when a fullscreen app is in the foreground.
- Mouse wheel over the bar pages through the desktops.
- Separators between the buttons (subtle).
- Movable by the handle
≡on the left; the position is remembered insettings.ini.
- Windows 11: developed and tested on 25H2 (build 26200). Works from 24H2 (26100).
- AutoHotkey v2 (tested with 2.0.26), default path
C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe. - VirtualDesktopAccessor.dll (bundled in this repo), from Ciantic/VirtualDesktopAccessor, release
2024-12-16-windows11.
- Download the latest
DeskTabs-vX.Y.Z.zipfrom the Releases page. - Extract it anywhere and keep
DeskTabs.exeandVirtualDesktopAccessor.dlltogether in the same folder. - Double-click
DeskTabs.exe.
Or install (and update) in one line, from PowerShell:
irm https://raw.githubusercontent.com/paehtz/DeskTabs/main/setup.ps1 | iexThis installs DeskTabs to %LOCALAPPDATA%\DeskTabs, adds an autostart entry and launches it. Run it again any time to update.
Note: an AutoHotkey-compiled
.execan trigger false positives in some antivirus scanners. That is why both the.exeand the full source are provided; you can always run from source instead.
- Clone the repo or download it as a ZIP and extract it to a folder of your choice.
- Install AutoHotkey v2 (if not already present).
- Double-click
DeskTabs.ahk(opens with AHK v2), or run it from the command line:
"C:\Program Files\AutoHotkey\v2\AutoHotkey64.exe" "<path-to-folder>\DeskTabs.ahk"
Autostart: place a shortcut in the startup folder
(%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\)
→ target: AutoHotkey64.exe, with the path to DeskTabs.ahk as the argument.
Quit / control: tray icon (screen symbol) → right-click:
- Rebuild bar
- Reset position
- Exit
Using an AI coding agent (e.g. Claude Code)? Fork the repo and see CLAUDE.md: it tells your agent how to run, validate and safely customize DeskTabs for your own setup.
All options live in the CONF block at the very top of DeskTabs.ahk:
| Option | Default | Meaning |
|---|---|---|
DockMode |
on |
on = on the taskbar (visually integrated, may flicker slightly when switching windows). above = just above the taskbar (flicker-free, but overlaps the bottom edge of windows). |
ThemeMode |
auto |
auto = follow the Windows theme (taskbar brightness via registry SystemUsesLightTheme). light / dark = fixed. A change at runtime is detected automatically (~1.2 s) and the bar is rebuilt. |
OffsetX |
10 | Distance from the left screen edge (px). |
SwitchMethod |
native |
native = emulate Win+Ctrl+Arrow (windows stay stable). dll = GoToDesktopNumber (faster, but drags windows along). |
ShowIndex |
1 | Number prefix ("3 · …"). |
ColorCoding |
1 | Colour bar per desktop. |
AccentBarH |
3 | Height of the colour bar (px). |
AutoHideFullscreen |
1 | Hide when a fullscreen app is in front. |
ClickActiveTaskView |
1 | Clicking the active desktop opens Win+Tab. |
WheelSwitch |
1 | Mouse wheel pages through desktops. |
Palette |
8 colours | Colour palette for the colour coding (by index). |
FontSizePt |
10 | Font size. |
MaxNameLen |
22 | Names longer than this are truncated. |
| Colours | auto | ColBarBg, ColInactiveBg/Tx, ColActiveBg/Tx, ColHoverBg/Tx, ColDivider are copied at startup from THEME_LIGHT / THEME_DARK (depending on ThemeMode) into CONF. To customise, edit the two THEME_* maps near the top of the script. |
[Position]
X=10
Y=1392
[Colors]
; Override the colour coding per desktop name (RRGGBB):
Design=E5471D
Buchhaltung=1565C0- Reading the desktops via
VirtualDesktopAccessor.dll(in-process, fast):GetDesktopCount,GetCurrentDesktopNumber,GetDesktopName,PinWindow,RegisterPostMessageHook. - Switching via simulated keyboard shortcuts (
SwitchMethod=native), not via the DLL, which prevents windows from being dragged along. - Live highlight update through
RegisterPostMessageHook(desktop-change notification) plus a 1.2 s fallback timer (Refresh), which also refreshes the desktop count and names and rebuilds the bar when needed. - Always on top (
DockMode=on): a combination ofSetWinEventHook(EVENT_SYSTEM_FOREGROUND)→ an immediateAssertTop()on every window switch,- a short burst (10× every 25 ms) to cover maximise animations,
- a 250 ms backstop timer.
- The window is
-Caption +AlwaysOnTop +ToolWindow +E0x08000000(WS_EX_NOACTIVATE → clicks do not steal focus from the working window) and pinned to all desktops. - Theme is detected via the registry (
SystemUsesLightThemeunder…\Themes\Personalize, the same value that controls taskbar brightness).ApplyTheme()copies the matching set (THEME_LIGHT/THEME_DARK) into theCONFcolour keys; theRefreshtimer detects a theme change and rebuilds the bar.
- 25H2 compatibility: the Ciantic DLL is labelled "24H2" but runs fine on 25H2 (26200). A Windows feature update that changes the virtual-desktop COM vtable could break the DLL → then grab a fresh build from Ciantic's repo.
GoToDesktopNumberdrags windows along: on 24H2/25H2 the DLL internally usesswitch_desktop_and_move_foreground_view. HenceSwitchMethod=native(shortcut emulation).&in a desktop name: AHK text controls interpret&as an accelerator marker. Fix: theSS_NOPREFIXstyle (+0x80) on the buttons, which shows&literally (e.g. "T&K").- z-order of colour bars / separators: overlapping controls get hidden by the button. So separators sit in the gaps and colour bars sit below the button (no overlap).
- AHK semicolon trap: a
;without a preceding space is NOT a comment but throws "Illegal character in expression". Always put a space before inline;. - DockMode trade-off:
on(on the taskbar) looks more integrated but fights the taskbar over z-order (a brief flicker on window switch despite the WinEvent hook + burst).above(just above it) is flicker-free but overlaps the bottom edge of windows. - Multi-monitor: the bar always sits on the primary taskbar (
Shell_TrayWnd) and follows automatically when the primary monitor changes in Windows. Secondary taskbars (Shell_SecondaryTrayWnd) are not served. - DLL feature scope:
VirtualDesktopAccessor.dlloffers NO function to reorder desktops (exports checked, incl.GetDesktopCount,GetCurrentDesktopNumber,GetDesktopName,GoToDesktopNumber,MoveWindowToDesktopNumber,PinWindow,RegisterPostMessageHook, but noMoveDesktop). Reordering would require MScholtes/VirtualDesktop.
- Finally solve the residual flicker in
DockMode=on: stay permanently on the taskbar without the twitch on window switch. Approaches: additional WinEvents (EVENT_OBJECT_REORDER,EVENT_SYSTEM_MINIMIZEEND), a denser burst, or making the bar a child of the taskbar (SetParent). Current default workaround:DockMode=above(flicker-free). - Drag-to-reorder the buttons with real Windows reordering via MScholtes/VirtualDesktop.
DeskTabs was built AI-assisted with Claude Code. My background is in strategy, design and concept work, not classic software development: my programming experience came mainly from template languages, HTML and CSS. With AI-assisted work I now turn my own ideas directly into working tools. DeskTabs is one of them, and at the same time a hands-on example of exactly what I pass on to companies as AI consulting.
DeskTabs is licensed under the MIT License © Henning Pähtz.
Disclaimer: DeskTabs is provided "as is", without warranty of any kind and without any liability, as stated in the MIT License. Use at your own risk.
- VirtualDesktopAccessor.dll (Ciantic) is bundled under the MIT License.
- The compiled
DeskTabs.exe(in the releases) embeds the AutoHotkey interpreter, which is licensed under GPL-2.0. The compiled executable is therefore distributed under GPL-2.0; the script source is in this repository and AutoHotkey's source is at its project page. Running from source (DeskTabs.ahk) does not bundle AutoHotkey.
Full notices: THIRD-PARTY-LICENSES.md.
Henning Pähtz: media scientist (Dipl.-Medienwiss.) based in Lutherstadt Eisleben, Germany. Web design, brand strategy, AI consulting and process automation.
🌐 paehtz.de · ✉️ henning@paehtz.de
- Ciantic/VirtualDesktopAccessor: the DLL that provides access to the Windows virtual-desktop API.
- AutoHotkey v2

