diff --git a/samples/VirtualDesktop.Showcase/MainWindow.xaml.cs b/samples/VirtualDesktop.Showcase/MainWindow.xaml.cs
index b79c6c8..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)
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)/VirtualDesktopNotification.cs b/source/VirtualDesktop/Interop/(wrappers)/VirtualDesktopNotification.cs
index 464f1e9..c08f3ee 100644
--- a/source/VirtualDesktop/Interop/(wrappers)/VirtualDesktopNotification.cs
+++ b/source/VirtualDesktop/Interop/(wrappers)/VirtualDesktopNotification.cs
@@ -5,16 +5,24 @@
namespace WindowsDesktop.Interop
{
- [ComInterfaceWrapper]
+ [ComInterfaceWrapper(2)]
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
public abstract class VirtualDesktopNotification
{
internal static VirtualDesktopNotification CreateInstance(ComInterfaceAssembly assembly)
{
- var type = assembly.GetType("VirtualDesktopNotificationListener");
- var instance = (VirtualDesktopNotification)Activator.CreateInstance(type);
-
- return instance;
+ var type2 = assembly.GetType("VirtualDesktopNotificationListener2");
+ if (type2 != null)
+ {
+ var instance = (VirtualDesktopNotification)Activator.CreateInstance(type2);
+ return instance;
+ }
+ else
+ {
+ var type = assembly.GetType("VirtualDesktopNotificationListener");
+ var instance = (VirtualDesktopNotification)Activator.CreateInstance(type);
+ return instance;
+ }
}
protected VirtualDesktop GetDesktop(object comObject)
@@ -49,5 +57,10 @@ protected void CurrentVirtualDesktopChangedCore(object pDesktopOld, object pDesk
{
VirtualDesktop.EventRaiser.RaiseCurrentChanged(this, VirtualDesktopCache.GetOrCreate(pDesktopOld), VirtualDesktopCache.GetOrCreate(pDesktopNew));
}
+
+ protected void VirtualDesktopRenamedCore(object pDesktop, string name)
+ {
+ VirtualDesktop.EventRaiser.RaiseRenamed(this, VirtualDesktopCache.GetOrCreate(pDesktop), name);
+ }
}
}
diff --git a/source/VirtualDesktop/VirtualDesktop.cs b/source/VirtualDesktop/VirtualDesktop.cs
index e585722..2444f0a 100644
--- a/source/VirtualDesktop/VirtualDesktop.cs
+++ b/source/VirtualDesktop/VirtualDesktop.cs
@@ -3,7 +3,6 @@
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
-using System.Text;
using WindowsDesktop.Interop;
using JetBrains.Annotations;
@@ -22,26 +21,14 @@ public partial class VirtualDesktop : ComInterfaceWrapperBase
///
public Guid Id { get; }
+ private string _name = null;
+
///
/// Gets the name for the virtual desktop.
///
public string Name
{
- get
- {
- if (this.ComVersion >= 2)
- {
- var name = this.Invoke(Args(), "GetName");
- if (!string.IsNullOrEmpty(name))
- {
- return name;
- }
- }
-
- var desktops = GetDesktops();
- var index = Array.IndexOf(desktops, this) + 1;
- return $"Desktop {index}";
- }
+ get => this._name;
set
{
if (this.ComVersion < 2) throw new PlatformNotSupportedException("This Windows 10 version is not supported.");
@@ -55,6 +42,11 @@ internal VirtualDesktop(ComInterfaceAssembly assembly, Guid id, object comObject
: base(assembly, comObject, latestVersion: 2)
{
this.Id = id;
+
+ if (this.ComVersion >= 2)
+ {
+ this._name = this.Invoke(Args(), "GetName");
+ }
}
///
@@ -115,5 +107,10 @@ public VirtualDesktop GetRight()
return null;
}
}
+
+ private void SetNameToCache(string name)
+ {
+ this._name = name;
+ }
}
}
diff --git a/source/VirtualDesktop/VirtualDesktop.csproj b/source/VirtualDesktop/VirtualDesktop.csproj
index 87a57ad..47871ea 100644
--- a/source/VirtualDesktop/VirtualDesktop.csproj
+++ b/source/VirtualDesktop/VirtualDesktop.csproj
@@ -34,6 +34,7 @@
+
@@ -48,6 +49,7 @@
+
diff --git a/source/VirtualDesktop/VirtualDesktop.static.notification.cs b/source/VirtualDesktop/VirtualDesktop.static.notification.cs
index 6e069ab..ff1eec6 100644
--- a/source/VirtualDesktop/VirtualDesktop.static.notification.cs
+++ b/source/VirtualDesktop/VirtualDesktop.static.notification.cs
@@ -29,6 +29,11 @@ partial class VirtualDesktop
/// Occurs when the current virtual desktop is changed.
///
public static event EventHandler CurrentChanged;
+
+ ///
+ /// Occurs when a virtual desktop is renamed.
+ ///
+ public static event EventHandler Renamed;
internal static class EventRaiser
{
@@ -65,6 +70,15 @@ public static void RaiseCurrentChanged(object sender, VirtualDesktop pDesktopOld
var args = new VirtualDesktopChangedEventArgs(pDesktopOld, pDesktopNew);
CurrentChanged?.Invoke(sender, args);
}
+
+ public static void RaiseRenamed(object sender, VirtualDesktop pDesktop, string name)
+ {
+ var oldName = pDesktop.Name;
+ pDesktop.SetNameToCache(name);
+
+ var args = new VirtualDesktopRenamedEventArgs(pDesktop, oldName, name);
+ Renamed?.Invoke(sender, args);
+ }
}
}
}
diff --git a/source/VirtualDesktop/VirtualDesktopRenamedEventArgs.cs b/source/VirtualDesktop/VirtualDesktopRenamedEventArgs.cs
new file mode 100644
index 0000000..d8e6a37
--- /dev/null
+++ b/source/VirtualDesktop/VirtualDesktopRenamedEventArgs.cs
@@ -0,0 +1,32 @@
+using System;
+
+namespace WindowsDesktop
+{
+ ///
+ /// Provides data for the event.
+ ///
+ public class VirtualDesktopRenamedEventArgs : EventArgs
+ {
+ ///
+ /// Gets the virtual desktop that was renamed.
+ ///
+ public VirtualDesktop Source { get; }
+
+ ///
+ /// Gets the old name of the virtual desktop.
+ ///
+ public string OldName { get; }
+
+ ///
+ /// Gets the new name of the virtual desktop.
+ ///
+ public string NewName { get; }
+
+ public VirtualDesktopRenamedEventArgs(VirtualDesktop source, string oldName, string newName)
+ {
+ this.Source = source;
+ this.OldName = oldName;
+ this.NewName = newName;
+ }
+ }
+}
diff --git a/source/VirtualDesktop/app.config b/source/VirtualDesktop/app.config
index 825ef2c..c854eee 100644
--- a/source/VirtualDesktop/app.config
+++ b/source/VirtualDesktop/app.config
@@ -21,6 +21,7 @@
IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6}
IVirtualDesktopManagerInternal2,{0F3A72B0-4566-487E-9A33-4ED302F6D6CE}
IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A}
+ IVirtualDesktopNotification2,{1BA7CF30-3591-43FA-ABFA-4AAF7ABEEDB7}
IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF}
IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F}