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}