Skip to content

C# command line tool to manage virtual desktops in Windows 10

License

Notifications You must be signed in to change notification settings

loststone2/VirtualDesktop

 
 

Repository files navigation

VirtualDesktop

C# command line tool to manage virtual desktops in Windows 10

Thanks to NyaMisty there is a first version for Windows Insider 21H2 and Windows 11 Insider now. This is an alpha version, not all functions are tested, some are faulty, some not implemented. Getting/setting names and individual wallpapers (new parameter /WallPaper:) seem to work now, removing wallpapers lead to crashing Windows Explorers. New API functions SetAllWallpaperPaths and RemoveAll declared (parameters AllWallpapers and RemoveAll). Implemented new native function /Movedesktop: instead of homebrew /InsertDesktop:. See help screen for new parameters.

V1.8, 2020-12-03

  • new parameters /SwapDesktop and /InsertDesktop to rearrange desktops
  • new parameter /Calc to add to or substract from the desktop number in pipeline

(look for a powershell version here: https://github.com/MScholtes/PSVirtualDesktop or here: https://github.com/MScholtes/TechNet-Gallery)

With Windows 10 2004 Microsoft thankfully did not change the API (COM GUIDs) for accessing the functions for virtual desktops, but implemented two new interfaces. I provide three versions of virtualdesktop.cs now: virtualdesktop.cs is for Windows 10 1809 and newer, virtualdesktop1803.cs is for Windows 10 1803, virtualdesktop1607.cs is for Windows 10 1607 to 1709 and Windows Server 2016. Using Compile.bat all executables will be generated (thanks to mzomparelli for investigating).

Generate:

Compile with Compile.bat (no visual studio needed, but obviously Windows 10)

Description:

Command line tool to manage the virtual desktops of Windows 10. 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).

/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).

/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).

/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>, desktop with text <s> in name or desktop with number in pipeline before desktop in pipeline or vice versa (short: /id).

/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.

/PinWindow:<s|n>   pin process with name <s> or id <n> to all desktops (short: /pw).

/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).

/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).

Hint:

Insert ^^ somewhere in window title parameters to prevent finding the own window. ^ is removed before searching window titles.

Examples:

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:1 "-MoveWindowHandle:note^^pad"

REM Insert desktop 7 before deskto p5
VirtualDesktop.exe /GetDesktop:7 /InsertDesktop:5

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

About

C# command line tool to manage virtual desktops in Windows 10

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 99.8%
  • Batchfile 0.2%