https://github.com/mscholtes/virtualdesktop
C# command line tool to manage virtual desktops in Windows 10
https://github.com/mscholtes/virtualdesktop
virtual-desktop virtualdesktop windows
Last synced: 12 months ago
JSON representation
C# command line tool to manage virtual desktops in Windows 10
- Host: GitHub
- URL: https://github.com/mscholtes/virtualdesktop
- Owner: MScholtes
- License: mit
- Created: 2017-05-08T14:27:30.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2025-03-14T14:07:33.000Z (about 1 year ago)
- Last Synced: 2025-05-04T18:49:31.009Z (12 months ago)
- Topics: virtual-desktop, virtualdesktop, windows
- Language: C#
- Homepage:
- Size: 495 KB
- Stars: 656
- Watchers: 27
- Forks: 69
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: Changes.txt
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# VirtualDesktop
C# command line tool to manage virtual desktops in Windows 10 and Windows 11
**Pre-compiled binaries in Releases**
**Version 1.20, 2025-01-18**
- new parameters /PinActiveWindow and /UnPinActiveWindow
- Windows 11: new parameter /Amimation to enable or disable animated desktop switches
- nicer icon :-)
- window handles can be negative
(look for a powershell version here: https://github.com/MScholtes/PSVirtualDesktop or here: https://www.powershellgallery.com/packages/VirtualDesktop)
**With Windows 11 23H2 Release 3085 Microsoft did change the API (COM GUIDs) for accessing the functions for virtual desktops again. I provide five versions of virtualdesktop.cs now: virtualdesktop.cs is for Windows 10, virtualdesktop11.cs is for Windows 11, virtualdesktop11-24h2.cs for Windows 11 24H2, virtualdesktopserver2022.cs is for Windows Server 2022, virtualdesktopserver2016.cs is for Windows Server 2016. Using Compile.bat all executables will be generated.**
## Generate:
Compile with Compile.bat (no visual studio needed, but obviously Windows 10 or 11)
## Description:
Command line tool to manage the virtual desktops of Windows 10 and 11.
Parameters can be given as a sequence of commands. The result - most of the times the number of the processed desktop - can be used as input for the next parameter. The result of the last command is returned as error level.
Virtual desktop numbers start with 0.
## Parameters (leading / can be omitted or - can be used instead):
**/Help /h /?** this help screen.
**/Verbose /Quiet** enable verbose (default) or quiet mode (short: /v and /q).
**/Break /Continue** break (default) or continue on error (short: /b and /co).
**/Animation:<s>** Enable switch animations (default) with 'On' or '1' and disable switch animations with 'Off' or '0' (short: /anim)(only VirtualDesktop11.exe).
**/List** list all virtual desktops (short: /li).
**/Count** get count of virtual desktops to pipeline (short: /c).
**/GetDesktop:<n|s>** get number of virtual desktop <n> or desktop with text <s> in name to pipeline (short: /gd).
**/GetCurrentDesktop** get number of current desktop to pipeline (short: /gcd).
**/Name[:<s>]** set name of desktop with number in pipeline (short: /na).
**/Wallpaper[:<s>]** set wallpaper path of desktop with number in pipeline (short: /wp)(only VirtualDesktop11.exe).
**/AllWallpapers:<s>** set wallpaper path of all desktops (short: /awp)(only VirtualDesktop11.exe).
**/IsVisible[:<n|s>]** is desktop number <n>, desktop with text <s> in name or number in pipeline visible (short: /iv)? Returns 0 for visible and 1 for invisible.
**/Switch[:<n|s>]** switch to desktop with number <n>, desktop with text <s> in name or with number in pipeline (short: /s).
**/Left** switch to virtual desktop to the left of the active desktop (short: /l).
**/Right** switch to virtual desktop to the right of the active desktop (short: /ri).
**/Wrap /NoWrap** /Left or /Right switch over or generate an error when the edge is reached (default)(short /w and /nw).
**/New** create new desktop (short: /n). Number is stored in pipeline.
**/Remove[:<n|s>]** remove desktop number <n>, desktop with text <s> in name or desktop with number in pipeline (short: /r).
**/RemoveAll** remove all desktops but visible (short: /ra).
**/SwapDesktop:<n|s>** swap desktop in pipeline with desktop number <n>, desktop with text <s> in name or desktop with number in pipeline (short: /sd).
**/InsertDesktop:<n|s>** insert desktop number <n> or desktop with text <s> in name before desktop in pipeline or vice versa (short: /id)(not VirtualDesktop11.exe).
**/MoveDesktop:<n|s>** move desktop in pipeline to desktop number <n> or desktop with text <s> in name (short: /md)(only VirtualDesktop11.exe).
**/MoveWindowsToDesktop::<n|s>** move windows on desktop in pipeline to desktop number <n> or desktop with text <s> in name (short: /mwtd).
**/MoveWindow:<s|n>** move process with name <s> or id <n> to desktop with number in pipeline (short: /mw).
**/MoveWindowHandle:<s|n>** move window with text <s> in title or handle <n> to desktop with number in pipeline (short: /mwh).
**/MoveActiveWindow** move active window to desktop with number in pipeline (short: /maw).
**/GetDesktopFromWindow:<s|n>** get desktop number where process with name <s> or id <n> is displayed (short: /gdfw).
**/GetDesktopFromWindowHandle:<s|n>** get desktop number where window with text <s> in title or handle <n> is displayed (short: /gdfwh).
**/IsWindowOnDesktop:<s|n>** check if process with name <s> or id <n> is on desktop with number in pipeline (short: /iwod). Returns 0 for yes, 1 for no.
**/IsWindowHandleOnDesktop:<s|n>** check if window with text <s> in title or handle <n> is on desktop with number in pipeline (short: /iwhod). Returns 0 for yes, 1 for no.
**/ListWindowsOnDesktop[:<n|s>]** list handles of windows on desktop number <n>, desktop with text <s> in name or desktop with number in pipeline (short: /lwod).
**/CloseWindowsOnDesktop[:<n|s>]** close windows on desktop number <n>, desktop with text <n> in name or desktop with number in pipeline (short: /cwod).
**/PinWindow:<s|n>** pin process with name <s> or id <n> to all desktops (short: /pw).
**/PinActiveWindow** pin active window to all desktops (short: /paw).
**/PinWindowHandle:<s|n>** pin window with text <s> in title or handle <n> to all desktops (short: /pwh).
**/UnPinWindow:<s|n>** unpin process with name <s> or id <n> from all desktops (short: /upw).
**/UnPinActiveWindow** unpin active window from all desktops (short: /upaw).
**/UnPinWindowHandle:<s|n>** unpin window with text <s> in title or handle <n> from all desktops (short: /upwh).
**/IsWindowPinned:<s|n>** check if process with name <s> or id <n> is pinned to all desktops (short: /iwp). Returns 0 for yes, 1 for no.
**/IsWindowHandlePinned:<s|n>** check if window with text <s> in title or handle <n> is pinned to all desktops (short: /iwhp). Returns 0 for yes, 1 for no.
**/PinApplication:<s|n>** pin application with name <s> or id <n> to all desktops (short: /pa).
**/UnPinApplication:<s|n>** unpin application with name <s> or id <n> from all desktops (short: /upa).
**/IsApplicationPinned:<s|n>** check if application with name <s> or id <n> is pinned to all desktops (short: /iap). Returns 0 for yes, 1 for no.
**/Calc:<n>** add <n> to result, negative values are allowed (short: /ca).
**/WaitKey** wait for key press (short: /wk).
**/Sleep:<n>** wait for <n> milliseconds (short: /sl).
## Hints:
Instead of a desktop name you can use LAST or \*LAST\* to select the last virtual desktop.
Insert ^^ somewhere in window title parameters to prevent finding the own window. ^ is removed before searching window titles.
## Examples:
```bat
Virtualdesktop.exe /LIST
Virtualdesktop.exe "-Switch:Desktop 2"
Virtualdesktop.exe -New -Switch -GetCurrentDesktop
Virtualdesktop.exe Q N /MOVEACTIVEWINDOW /SWITCH
Virtualdesktop.exe sleep:200 gd:1 mw:notepad s
Virtualdesktop.exe /Count /continue /Remove /Remove /Count
Virtualdesktop.exe /Count /Calc:-1 /Switch
VirtualDesktop.exe -IsWindowPinned:cmd
if ERRORLEVEL 1 VirtualDesktop.exe PinWindow:cmd
Virtualdesktop.exe -GetDesktop:*last* "-MoveWindowHandle:note^^pad"
for /f "tokens=4 delims= " %i in ('VirtualDesktop.exe c') do @set DesktopCount=%i
echo Count of desktops is %DesktopCount%
if %DesktopCount% GTR 1 VirtualDesktop.exe REMOVE
```