<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Windows 11 on Blog of Jérémie Litzler</title><link>https://iamjeremie.me/tags/windows-11/</link><description>Recent content in Windows 11 on Blog of Jérémie Litzler</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Wed, 28 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://iamjeremie.me/tags/windows-11/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Bind Shortcuts on Multi-Desktop Windows 11</title><link>https://iamjeremie.me/post/2026-10/bind-shortcuts-to-multi-desktop-windows-11/</link><pubDate>Wed, 28 Oct 2026 00:00:00 +0000</pubDate><guid>https://iamjeremie.me/post/2026-10/bind-shortcuts-to-multi-desktop-windows-11/</guid><description>&lt;img src="https://iamjeremie.me/post/2026-10/bind-shortcuts-to-multi-desktop-windows-11/2026-10-28-keys-A-L-T-aligned-on-salmon-color-background.jpg" alt="Featured image of post How to Bind Shortcuts on Multi-Desktop Windows 11" /&gt;&lt;p&gt;I wanted something simple: pressing a shortcut that lands me on the virtual desktop I needed activated. Windows 11 makes available virtual desktops, but no way to jump to one by its number or name.&lt;/p&gt;
&lt;p&gt;Before writing a single line of code, I wanted to know whether someone had already solved this. Someone had, and this article explains how I chose the tool and how I set it up.&lt;/p&gt;
&lt;h2 id="what-windows-11-gives-you-out-of-the-box"&gt;&lt;a href="#what-windows-11-gives-you-out-of-the-box" class="header-anchor"&gt;&lt;/a&gt;What Windows 11 Gives You Out of the Box
&lt;/h2&gt;&lt;p&gt;According to the &lt;a class="link" href="https://support.microsoft.com/en-us/windows/keyboard-shortcuts-in-windows-dcc61a57-8ff0-cffe-9796-cb9706c75eec" target="_blank" rel="noopener"&gt;Microsoft keyboard shortcuts page&lt;/a&gt;, the native shortcuts for virtual desktops are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Win+Tab&lt;/code&gt; to open Task view&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Win+Ctrl+D&lt;/code&gt; to create another desktop&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Win+Ctrl+Right&lt;/code&gt; arrow and &lt;code&gt;Win+Ctrl+Left&lt;/code&gt; arrow to move between desktops&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Win+Ctrl+F4&lt;/code&gt; to close the current desktop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of them jumps to a desktop by number. And let me tell you that, within 2 days of usage, I felt friction to perform &lt;code&gt;Win+Tab&lt;/code&gt;, then &lt;code&gt;Tab&lt;/code&gt; then the arrows to select the desktop and &lt;code&gt;Enter&lt;/code&gt; to select it&amp;hellip; The &lt;code&gt;Win+number&lt;/code&gt; family looks promising, but it acts on apps pinned to the taskbar, not on desktops. So Task view stays a mouse or arrow-key affair, with no typed-number prompt.&lt;/p&gt;
&lt;h2 id="why-every-tool-is-a-bit-fragile"&gt;&lt;a href="#why-every-tool-is-a-bit-fragile" class="header-anchor"&gt;&lt;/a&gt;Why Every Tool Is a Bit Fragile
&lt;/h2&gt;&lt;p&gt;Microsoft documents only one COM interface for virtual desktops, &lt;a class="link" href="https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-ivirtualdesktopmanager" target="_blank" rel="noopener"&gt;&lt;code&gt;IVirtualDesktopManager&lt;/code&gt;&lt;/a&gt;. It has three methods: &lt;code&gt;GetWindowDesktopId&lt;/code&gt;, &lt;code&gt;IsWindowOnCurrentVirtualDesktop&lt;/code&gt; and &lt;code&gt;MoveWindowToDesktop&lt;/code&gt;. It cannot switch the active desktop, create one, remove one or list them. The same page even says applications should avoid switching the user from one desktop to another.&lt;/p&gt;
&lt;p&gt;So every tool that switches by number relies on undocumented shell interfaces, and the repositories say so themselves. &lt;a class="link" href="https://github.com/MScholtes/VirtualDesktop" target="_blank" rel="noopener"&gt;&lt;code&gt;MScholtes/VirtualDesktop&lt;/code&gt;&lt;/a&gt; states that Windows 11 23H2 build 3085 changed the COM GUIDs again and ships separate source variants per Windows version. &lt;a class="link" href="https://github.com/Grabacr07/VirtualDesktop" target="_blank" rel="noopener"&gt;&lt;code&gt;Grabacr07/VirtualDesktop&lt;/code&gt;&lt;/a&gt; says the class IDs change between Windows versions. &lt;a class="link" href="https://github.com/dankrusi/WindowsVirtualDesktopHelper" target="_blank" rel="noopener"&gt;&lt;code&gt;dankrusi/WindowsVirtualDesktopHelper&lt;/code&gt;&lt;/a&gt; warns that some builds may not fully work. That fragility shaped how I judged the candidates.&lt;/p&gt;
&lt;h2 id="how-i-picked-one-solution"&gt;&lt;a href="#how-i-picked-one-solution" class="header-anchor"&gt;&lt;/a&gt;How I Picked One Solution
&lt;/h2&gt;&lt;p&gt;I only trusted primary sources: official repositories, &lt;code&gt;README&lt;/code&gt; files, example files, GitHub metadata and Microsoft documentation. Anything I could not confirm there was dropped or listed as a gap.&lt;/p&gt;
&lt;p&gt;My need was specific. I wanted to switch native Windows 11 virtual desktops by number, on build 26200 (25H2), in a work and personal context. So I applied two filters. The &lt;code&gt;README&lt;/code&gt; had to declare Windows 11 support, and the repository needed a release or a push within the last six months of my research date, 2026-10-21, so the cutoff was 2026-04-21.&lt;/p&gt;
&lt;p&gt;Most candidates fell out quickly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MScholtes/VirtualDesktop declares Windows 11 and has a 24H2 variant, but its last release and push date from 2025-08-12.&lt;/li&gt;
&lt;li&gt;lu0/windows-desktop-switcher only documents Windows 10 and was last pushed in March 2025.&lt;/li&gt;
&lt;li&gt;GlazeWM and Komorebi are active, but they use their own workspaces instead of native desktops, and neither declares Windows 11 support. Komorebi&amp;rsquo;s license also restricts work use.&lt;/li&gt;
&lt;li&gt;Grabacr07/VirtualDesktop and mzomparelli/VirtualDesktop are libraries without recent activity.&lt;/li&gt;
&lt;li&gt;SylphyHorn targets Windows 10 and has been dormant since 2022.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PowerToys has no virtual desktop switcher in its utility list. Keyboard Manager could, in theory, but no project documents that combination, so I did not count on it. The Windhawk mods I found are click-based or edge-based, and I could not read the mod pages directly, so I kept them out as well.&lt;/p&gt;
&lt;p&gt;Two candidates survived. Windows Virtual Desktop Helper by dankrusi supports custom hotkeys such as &lt;code&gt;Ctrl + Alt + Shift + D1 = Desktop1&lt;/code&gt;, but its &lt;code&gt;README&lt;/code&gt; names Windows 10 and 11 without mentioning 24H2, 25H2 or build 26200.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/Ciantic/VirtualDesktopAccessor" target="_blank" rel="noopener"&gt;VirtualDesktopAccessor&lt;/a&gt; by Ciantic was the one. It is MIT licensed, its last push was on 2026-10-11, and its &lt;code&gt;README&lt;/code&gt; says it requires at least 24H2 build 26100.2605 and was tested with 25H2 build 26200.8117. That is the only candidate that explicitly covers my build. It is a library, not an app, so I write the hotkeys myself in AutoHotkey, which suits me fine.&lt;/p&gt;
&lt;p&gt;One disappointment: none of the tools I reviewed ships a typed-number prompt. My original idea of pressing a shortcut and then typing a desktop number would have to be built on top of &lt;code&gt;GoToDesktopNumber&lt;/code&gt;. For now, direct hotkeys are enough.&lt;/p&gt;
&lt;h2 id="why-alt-and-not-fn"&gt;&lt;a href="#why-alt-and-not-fn" class="header-anchor"&gt;&lt;/a&gt;Why Alt and Not Fn
&lt;/h2&gt;&lt;p&gt;I first wanted to use the Fn key. On most keyboards, though, Fn is handled in the keyboard firmware, so it is invisible to Windows and AutoHotkey. Alt stands in for it. My three desktops are named Bureautique, Dev and SQL, and they answer to Alt+Q, Alt+W and Alt+E.&lt;/p&gt;
&lt;h2 id="setting-it-up"&gt;&lt;a href="#setting-it-up" class="header-anchor"&gt;&lt;/a&gt;Setting It Up
&lt;/h2&gt;&lt;p&gt;You need three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 11 24H2 build 26100.2605 or later.&lt;/li&gt;
&lt;li&gt;AutoHotkey v2, from the &lt;a class="link" href="https://www.autohotkey.com/download/" target="_blank" rel="noopener"&gt;official download page&lt;/a&gt;. The page lists 2.0.30 as the latest stable version at the time of writing and notes that browsers sometimes flag the download falsely.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VirtualDesktopAccessor.dll&lt;/code&gt; from the &lt;a class="link" href="https://github.com/Ciantic/VirtualDesktopAccessor/releases" target="_blank" rel="noopener"&gt;project releases&lt;/a&gt;. The latest release, tagged &lt;code&gt;2024-12-16-windows11&lt;/code&gt;, has a single asset with that name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you&amp;rsquo;ve gathered all those, install AutoHotkey v2 with the defaults. Then create a folder such as &lt;code&gt;C:\Tools\vda&lt;/code&gt; and drop the DLL in it. The script expects the DLL next to itself.&lt;/p&gt;
&lt;p&gt;The release DLL dates from December 2024, while the &lt;code&gt;README&lt;/code&gt;&amp;rsquo;s 25H2 test comes from the current source. I confirmed the setup works on build 26200. If &lt;code&gt;LoadLibrary&lt;/code&gt; fails or every call returns -1 on your machine, you should build the DLL from the repository source instead (which I haven&amp;rsquo;t tried). The &lt;code&gt;README&lt;/code&gt; gives no build instructions, but the repository contains a Rust crate. With AI, cloning the repo and asking an agent to look at it may be enough to rebuild the DLL if the need appears someday.&lt;/p&gt;
&lt;p&gt;Then, save the following as &lt;code&gt;C:\Tools\vda\desktops.ahk&lt;/code&gt;. Desktop numbers are zero-based in the project&amp;rsquo;s example, so Bureautique is 0, Dev is 1 and SQL is 2.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-autohotkey" data-lang="autohotkey"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;#Requires&lt;/span&gt; &lt;span class="n"&gt;AutoHotkey&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;#SingleInstance&lt;/span&gt; &lt;span class="n"&gt;Force&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;SetWorkingDir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A_ScriptDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; Same folder as the script&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hVDA&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;LoadLibrary&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Str&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;A_ScriptDir&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;\VirtualDesktopAccessor.dll&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;hVDA&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;MsgBox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Cannot load VirtualDesktopAccessor.dll from &amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;A_ScriptDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;ExitApp&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GetDesktopCountProc&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;GetProcAddress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hVDA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;AStr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;GetDesktopCount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GoToDesktopNumberProc&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;GetProcAddress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hVDA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;AStr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;GoToDesktopNumber&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CreateDesktopProc&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;GetProcAddress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hVDA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;AStr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;CreateDesktop&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SetDesktopNameProc&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;GetProcAddress&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hVDA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;AStr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;SetDesktopName&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GetDesktopCount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;global&lt;/span&gt; &lt;span class="n"&gt;GetDesktopCountProc&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetDesktopCountProc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Int&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GoToDesktopNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;global&lt;/span&gt; &lt;span class="n"&gt;GoToDesktopNumberProc&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GoToDesktopNumberProc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Int&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Int&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SetDesktopName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;global&lt;/span&gt; &lt;span class="n"&gt;SetDesktopNameProc&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;nameUtf8&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;StrPut&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nameUtf8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SetDesktopNameProc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Int&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Ptr&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nameUtf8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Int&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; Make sure three desktops exist, then name them&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetDesktopCount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;DllCall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CreateDesktopProc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Int&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SetDesktopName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Bureautique&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SetDesktopName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Dev&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SetDesktopName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;SQL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; Alt+Q, Alt+W, Alt+E&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;GoToDesktopNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;GoToDesktopNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt; &lt;span class="n"&gt;GoToDesktopNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The script creates missing desktops on startup, so you do not even need to press &lt;code&gt;Win+Ctrl+D&lt;/code&gt; beforehand. Double-click the file and a green H icon appears in the notification area. Press &lt;code&gt;Alt+W&lt;/code&gt; and you should land on Dev. Open Task view with &lt;code&gt;Win+Tab&lt;/code&gt; to see the desktop names.&lt;/p&gt;
&lt;p&gt;To start it at sign-in, press Win+R, type &lt;code&gt;shell:startup&lt;/code&gt; and press Enter, then create a shortcut to &lt;code&gt;desktops.ahk&lt;/code&gt; in that folder. It seems that it doesn&amp;rsquo;t work all the time, though. So in my case, I run the &lt;code&gt;Windows+R&lt;/code&gt;and type &lt;code&gt;C:\Tools\vda\C:\Tools\vda\desktops.ahk&lt;/code&gt; which shows up in my history as I type the disk letter.&lt;/p&gt;
&lt;h2 id="things-to-watch"&gt;&lt;a href="#things-to-watch" class="header-anchor"&gt;&lt;/a&gt;Things to Watch
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Alt+letter&lt;/code&gt; combinations are also used as menu mnemonics in some applications. While the script runs, the AutoHotkey hotkey takes priority, so those in-app shortcuts stop working for Q, W and E. If that matters to you, pick another modifier combination.&lt;/p&gt;
&lt;p&gt;Hotkeys also match the character on your layout. On an AZERTY keyboard, Q, W and E sit in different physical positions than on QWERTY. To bind physical positions instead, use scan codes in the hotkey definitions.&lt;/p&gt;
&lt;p&gt;According to the &lt;code&gt;README&lt;/code&gt;, the names set by &lt;code&gt;SetDesktopName&lt;/code&gt; work on Windows 11 only, and every function returns -1 on error. My script does not check return values. I have confirmed that names survive a restart of Explorer or Windows. However, I have yet to see if the DLL survives after the next Windows update: I have not tested it yet.&lt;/p&gt;
&lt;p&gt;Finally, remember that the COM interfaces behind all this are undocumented. A Windows update can break the DLL until the project ships a fix.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;&lt;a href="#conclusion" class="header-anchor"&gt;&lt;/a&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Windows 11 will not let you jump to a desktop by number, and every tool that adds the feature leans on interfaces Microsoft has never documented. That is why I judged candidates on one question: does the &lt;code&gt;README&lt;/code&gt; explicitly cover my build, and is the project alive? Only &lt;code&gt;VirtualDesktopAccessor&lt;/code&gt; passed both tests. Fifty lines of AutoHotkey later, &lt;code&gt;Alt+Q&lt;/code&gt;, &lt;code&gt;Alt+W&lt;/code&gt; and &lt;code&gt;Alt+E&lt;/code&gt; take me where I want to go in a snap. After the next Windows update, I will run the script again and see whether it still holds.&lt;/p&gt;
&lt;p&gt;If you liked this article…&lt;/p&gt;
&lt;div class="jli-notice jli-notice-tip" id="Follow me" &gt;
 &lt;p class="jli-notice-title"&gt;Follow me&lt;/p&gt;&lt;p&gt;Thanks for reading this article. Make sure to &lt;a class="link" href="https://x.com/LitzlerJeremie" target="_blank" rel="noopener"&gt;follow me on X&lt;/a&gt;, &lt;a class="link" href="https://iamjeremie.substack.com/" target="_blank" rel="noopener"&gt;subscribe to my Substack publication&lt;/a&gt; and bookmark my blog to read more in the future.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Credit: Photo de Miguel Á. Padriñán (&lt;code&gt;https://www.pexels.com/fr-fr/photo/clavier-mot-boutons-saisir-2882505/&lt;/code&gt;)&lt;/p&gt;</description></item></channel></rss>