Slions.VirtualDesktop.WinForms 6.6.0

dotnet add package Slions.VirtualDesktop.WinForms --version 6.6.0                
NuGet\Install-Package Slions.VirtualDesktop.WinForms -Version 6.6.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Slions.VirtualDesktop.WinForms" Version="6.6.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Slions.VirtualDesktop.WinForms --version 6.6.0                
#r "nuget: Slions.VirtualDesktop.WinForms, 6.6.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Slions.VirtualDesktop.WinForms as a Cake Addin
#addin nuget:?package=Slions.VirtualDesktop.WinForms&version=6.6.0

// Install Slions.VirtualDesktop.WinForms as a Cake Tool
#tool nuget:?package=Slions.VirtualDesktop.WinForms&version=6.6.0                

VirtualDesktop

VirtualDesktop is C# wrapper for IVirtualDesktopManager on Windows 11 (and Windows 10).

Build Publish License

Platform NuGet
Core NuGet Badge
Forms NuGet Badge
WPF NuGet Badge

Features

  • Switch, add, and remove a virtual desktop.
  • Move the window in the same process to any virtual desktop.
  • Move the window of another process to any virtual desktop (Support in version 2.0 or later).
  • Pin any window or application; will be display on all desktops.
  • Notification for switching, deletion, renaming, etc.
  • Change the wallpaper for each desktop.

Sample app

alternate text is missing from this package README image samples/VirtualDesktop.Showcase

Requirements

<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
  • .NET 5, 6 or 7
  • Windows 10 build 19041 (20H1) or later

Installation

Install NuGet package(s).

PM> Install-Package VirtualDesktop

How to use

Preparation

Because of the dependency on C#/WinRT (repo), the target framework must be set to net5.0-windows10.0.19041.0 or later.

<TargetFramework>net5.0-windows10.0.19041.0</TargetFramework>
<TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>

If it doesn't work, try creating an app.manifest file and optimize to work on Windows 10.

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
	    
	    <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
    </application>
</compatibility>

The namespace to use is WindowsDesktop.

using WindowsDesktop;

Get instance of VirtualDesktop class

// Get all virtual desktops
var desktops = VirtualDesktop.GetDesktops();

// Get Virtual Desktop for specific window
var desktop = VirtualDesktop.FromHwnd(hwnd);

// Get the left/right desktop
var left  = desktop.GetLeft();
var right = desktop.GetRight();

Manage virtual desktops

// Create new
var desktop = VirtualDesktop.Create();

// Remove
desktop.Remove();

// Switch
desktop.GetLeft().Switch();

Subscribe virtual desktop events

// Notification of desktop switching
VirtualDesktop.CurrentChanged += (_, args) => Console.WriteLine($"Switched: {args.NewDesktop.Name}");

// Notification of desktop creating
VirtualDesktop.Created += (_, desktop) => desktop.Switch();

for WPF window

// Need to install 'VirtualDesktop.WPF' package

// Check whether a window is on the current desktop.
var isCurrent = window.IsCurrentVirtualDesktop();

// Get Virtual Desktop for WPF window
var desktop = window.GetCurrentDesktop();

// Move window to specific Virtual Desktop
window.MoveToDesktop(desktop);

// Pin window
window.Pin()

Windows version support

The class IDs of some of the undocumented interfaces we use tend to change a lot between different versions of Windows. If the demo application crashes on start-up chances are all you need to do is provide the proper IDs for the version of Windows you are running on.

Open regedit and export this path into a file: \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface. Open the resulting reg file and search it for matches against the whole word of each interface name we need:

  • IApplicationView
  • IApplicationViewCollection
  • IObjectArray
  • IServiceProvider
  • IVirtualDesktop
  • IVirtualDesktopManager
  • IVirtualDesktopManagerInternal
  • IVirtualDesktopNotification
  • IVirtualDesktopNotificationService
  • IVirtualDesktopPinnedApps

Once you have the IDs add them in a new setting element in app.config. Make sure to specify the correct 5 digits Windows build version. You can get it using one of those methods:

  • From the UI run: winver
  • From shell run: ver
  • From powershell run: cmd /c ver

Make sure to contribute back your changes.

Publish

To publish a new release specify your version in Directory.Build.props and push the changes with a commit description such as: Release vx.y.z where x, y, z form your version number. That should publish it on NuGet providing that your secret NUGET_API_KEY is still valid.

Resources

License

This library is under the MIT License.

Product Compatible and additional computed target framework versions.
.NET net5.0-windows10.0.19041 is compatible.  net6.0-windows was computed.  net6.0-windows10.0.19041 is compatible.  net7.0-windows was computed.  net7.0-windows10.0.19041 is compatible.  net8.0-windows was computed.  net8.0-windows10.0.19041 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
6.6.0 1,011 2/20/2024
6.5.0 130 2/4/2024
6.4.0 207 11/27/2023
6.3.0 144 11/21/2023
6.2.1 161 9/1/2023
6.2.0 145 9/1/2023
6.1.0 145 9/1/2023
6.0.0 158 8/31/2023
5.2.0 169 8/18/2023
5.1.2 160 8/16/2023
5.1.1 175 8/12/2023
5.1.0 163 8/12/2023
5.0.9 171 8/12/2023