diff --git a/samples/VirtualDesktop.Showcase/MainWindow.xaml b/samples/VirtualDesktop.Showcase/MainWindow.xaml
index fdda1f6..07af1bf 100644
--- a/samples/VirtualDesktop.Showcase/MainWindow.xaml
+++ b/samples/VirtualDesktop.Showcase/MainWindow.xaml
@@ -22,6 +22,16 @@
+
+
+
+
diff --git a/samples/VirtualDesktop.Showcase/MainWindow.xaml.cs b/samples/VirtualDesktop.Showcase/MainWindow.xaml.cs
index 720cf14..634b892 100644
--- a/samples/VirtualDesktop.Showcase/MainWindow.xaml.cs
+++ b/samples/VirtualDesktop.Showcase/MainWindow.xaml.cs
@@ -30,6 +30,7 @@ private static async void InitializeComObjects()
}
VirtualDesktop.CurrentChanged += (sender, args) => System.Diagnostics.Debug.WriteLine($"Desktop changed: {args.NewDesktop.Id}");
+ VirtualDesktop.Renamed += (sender, args) => System.Diagnostics.Debug.WriteLine($"Desktop renamed: {args.OldName} -> {args.NewName} ({args.Source.Id})");
}
private void CreateNew(object sender, RoutedEventArgs e)
@@ -141,6 +142,48 @@ private async void Remove(object sender, RoutedEventArgs e)
}
}
+ private async void GetName(object sender, RoutedEventArgs e)
+ {
+ if (this.ThisWindowMenu.IsChecked ?? false)
+ {
+ var name = this.GetCurrentDesktop().Name;
+ MessageBox.Show(name, "Current desktop name");
+ }
+ else
+ {
+ await Task.Delay(_delay);
+ var name = this.GetCurrentDesktop().Name;
+ MessageBox.Show(name, "Current desktop name");
+ }
+ }
+
+ private async void SetName(object sender, RoutedEventArgs e)
+ {
+ if (this.ThisWindowMenu.IsChecked ?? false)
+ {
+ try
+ {
+ this.GetCurrentDesktop().Name = this.NameTextBlock.Text;
+ }
+ catch (PlatformNotSupportedException ex)
+ {
+ MessageBox.Show(ex.Message, "Error");
+ }
+ }
+ else
+ {
+ await Task.Delay(_delay);
+ try
+ {
+ this.GetCurrentDesktop().Name = this.NameTextBlock.Text;
+ }
+ catch (PlatformNotSupportedException ex)
+ {
+ MessageBox.Show(ex.Message, "Error");
+ }
+ }
+ }
+
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
diff --git a/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktop2.cs b/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktop2.cs
new file mode 100644
index 0000000..70c75fd
--- /dev/null
+++ b/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktop2.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Concurrent;
+using System.Runtime.InteropServices;
+
+namespace WindowsDesktop.Interop
+{
+ [ComImport]
+ [Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IVirtualDesktop2
+ {
+ bool IsViewVisible(object pView);
+
+ Guid GetID();
+
+ [return: MarshalAs(UnmanagedType.HString)]
+ string GetName();
+ }
+
+ // see also:
+ // https://github.com/MScholtes/VirtualDesktop/blob/f7c0018069f5500bce3b170a53fb71edee44ebec/VirtualDesktop.cs#L156-L173
+
+ public class VirtualDesktopCacheImpl2 : IVirtualDesktopCache
+ {
+ private readonly ConcurrentDictionary _wrappers = new ConcurrentDictionary();
+
+ public Func Factory { get; set; }
+
+ public VirtualDesktop GetOrCreate(object comObject)
+ {
+ if (comObject is IVirtualDesktop2)
+ {
+ return this._wrappers.GetOrAdd(((IVirtualDesktop)comObject).GetID(), id => this.Factory(id, comObject));
+ }
+
+ throw new ArgumentException();
+ }
+
+ public void Clear()
+ {
+ this._wrappers.Clear();
+ }
+ }
+}
diff --git a/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktopManagerInternal2.cs b/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktopManagerInternal2.cs
new file mode 100644
index 0000000..7a8a927
--- /dev/null
+++ b/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktopManagerInternal2.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace WindowsDesktop.Interop
+{
+ [ComImport]
+ [Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ internal interface IVirtualDesktopManagerInternal2
+ {
+ int GetCount();
+
+ void MoveViewToDesktop(IApplicationView pView, IVirtualDesktop desktop);
+
+ bool CanViewMoveDesktops(IApplicationView pView);
+
+ IVirtualDesktop GetCurrentDesktop();
+
+ IObjectArray GetDesktops();
+
+ IVirtualDesktop GetAdjacentDesktop(IVirtualDesktop pDesktopReference, AdjacentDesktop uDirection);
+
+ void SwitchDesktop(IVirtualDesktop desktop);
+
+ IVirtualDesktop CreateDesktopW();
+
+ void RemoveDesktop(IVirtualDesktop pRemove, IVirtualDesktop pFallbackDesktop);
+
+ IVirtualDesktop FindDesktop(ref Guid desktopId);
+
+ void Unknown1(IVirtualDesktop desktop, out IntPtr unknown1, out IntPtr unknown2);
+
+ void SetName(IVirtualDesktop desktop, [MarshalAs(UnmanagedType.HString)] string name);
+ }
+
+ // see also:
+ // https://github.com/MScholtes/VirtualDesktop/blob/f7c0018069f5500bce3b170a53fb71edee44ebec/VirtualDesktop.cs#L193-L211
+}
diff --git a/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktopNotification2.cs b/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktopNotification2.cs
new file mode 100644
index 0000000..7a5d960
--- /dev/null
+++ b/source/VirtualDesktop/Interop/(interfaces)/IVirtualDesktopNotification2.cs
@@ -0,0 +1,63 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace WindowsDesktop.Interop
+{
+ [ComImport]
+ [Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */]
+ [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
+ public interface IVirtualDesktopNotification2
+ {
+ void VirtualDesktopCreated(IVirtualDesktop pDesktop);
+
+ void VirtualDesktopDestroyBegin(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback);
+
+ void VirtualDesktopDestroyFailed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback);
+
+ void VirtualDesktopDestroyed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback);
+
+ void ViewVirtualDesktopChanged(IntPtr pView);
+
+ void CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew);
+
+ void VirtualDesktopRenamed(IVirtualDesktop pDesktop, [MarshalAs(UnmanagedType.HString)] string name);
+ }
+
+ public class VirtualDesktopNotificationListener2 : VirtualDesktopNotification, IVirtualDesktopNotification, IVirtualDesktopNotification2
+ {
+ public void VirtualDesktopCreated(IVirtualDesktop pDesktop)
+ {
+ this.VirtualDesktopCreatedCore(pDesktop);
+ }
+
+ public void VirtualDesktopDestroyBegin(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback)
+ {
+ this.VirtualDesktopDestroyBeginCore(pDesktopDestroyed, pDesktopFallback);
+ }
+
+ public void VirtualDesktopDestroyFailed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback)
+ {
+ this.VirtualDesktopDestroyFailedCore(pDesktopDestroyed, pDesktopFallback);
+ }
+
+ public void VirtualDesktopDestroyed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback)
+ {
+ this.VirtualDesktopDestroyedCore(pDesktopDestroyed, pDesktopFallback);
+ }
+
+ public void ViewVirtualDesktopChanged(IntPtr pView)
+ {
+ this.ViewVirtualDesktopChangedCore(pView);
+ }
+
+ public void CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew)
+ {
+ this.CurrentVirtualDesktopChangedCore(pDesktopOld, pDesktopNew);
+ }
+
+ public void VirtualDesktopRenamed(IVirtualDesktop pDesktop, [MarshalAs(UnmanagedType.HString)] string name)
+ {
+ this.VirtualDesktopRenamedCore(pDesktop, name);
+ }
+ }
+}
diff --git a/source/VirtualDesktop/Interop/(wrappers)/VirtualDesktopManagerInternal.cs b/source/VirtualDesktop/Interop/(wrappers)/VirtualDesktopManagerInternal.cs
index ca6d145..a1e003b 100644
--- a/source/VirtualDesktop/Interop/(wrappers)/VirtualDesktopManagerInternal.cs
+++ b/source/VirtualDesktop/Interop/(wrappers)/VirtualDesktopManagerInternal.cs
@@ -1,14 +1,15 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
+using System.Security.Cryptography;
namespace WindowsDesktop.Interop
{
- [ComInterfaceWrapper]
+ [ComInterfaceWrapper(2)]
internal class VirtualDesktopManagerInternal : ComInterfaceWrapperBase
{
public VirtualDesktopManagerInternal(ComInterfaceAssembly assembly)
- : base(assembly, service: CLSID.VirtualDesktopAPIUnknown)
+ : base(assembly, latestVersion: 2, service: CLSID.VirtualDesktopAPIUnknown)
{
}
@@ -62,5 +63,12 @@ public VirtualDesktop FindDesktop(ref Guid desktopId)
private VirtualDesktop GetDesktop(object[] parameters = null, [CallerMemberName] string methodName = "")
=> VirtualDesktopCache.GetOrCreate(this.Invoke