diff --git a/src/VirtualDesktop/Interop/Build10240/.Provider.cs b/src/VirtualDesktop/Interop/Build10240_0000/.Provider.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.Provider.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.Provider.cs diff --git a/src/VirtualDesktop/Interop/Build10240/.interfaces/AssemblyInfo.cs b/src/VirtualDesktop/Interop/Build10240_0000/.interfaces/AssemblyInfo.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.interfaces/AssemblyInfo.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.interfaces/AssemblyInfo.cs diff --git a/src/VirtualDesktop/Interop/Build10240/.interfaces/IApplicationView.cs b/src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IApplicationView.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.interfaces/IApplicationView.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IApplicationView.cs diff --git a/src/VirtualDesktop/Interop/Build10240/.interfaces/IApplicationViewCollection.cs b/src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IApplicationViewCollection.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.interfaces/IApplicationViewCollection.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IApplicationViewCollection.cs diff --git a/src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktop.cs b/src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktop.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktop.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktop.cs diff --git a/src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktopManagerInternal.cs b/src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktopManagerInternal.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktopManagerInternal.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktopManagerInternal.cs diff --git a/src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktopNotification.cs b/src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktopNotification.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktopNotification.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktopNotification.cs diff --git a/src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktopNotificationService.cs b/src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktopNotificationService.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktopNotificationService.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktopNotificationService.cs diff --git a/src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktopPinnedApps.cs b/src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktopPinnedApps.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/.interfaces/IVirtualDesktopPinnedApps.cs rename to src/VirtualDesktop/Interop/Build10240_0000/.interfaces/IVirtualDesktopPinnedApps.cs diff --git a/src/VirtualDesktop/Interop/Build10240/ApplicationView.cs b/src/VirtualDesktop/Interop/Build10240_0000/ApplicationView.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/ApplicationView.cs rename to src/VirtualDesktop/Interop/Build10240_0000/ApplicationView.cs diff --git a/src/VirtualDesktop/Interop/Build10240/ApplicationViewCollection.cs b/src/VirtualDesktop/Interop/Build10240_0000/ApplicationViewCollection.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/ApplicationViewCollection.cs rename to src/VirtualDesktop/Interop/Build10240_0000/ApplicationViewCollection.cs diff --git a/src/VirtualDesktop/Interop/Build10240/VirtualDesktop.cs b/src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktop.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/VirtualDesktop.cs rename to src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktop.cs diff --git a/src/VirtualDesktop/Interop/Build10240/VirtualDesktopManagerInternal.cs b/src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktopManagerInternal.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/VirtualDesktopManagerInternal.cs rename to src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktopManagerInternal.cs diff --git a/src/VirtualDesktop/Interop/Build10240/VirtualDesktopNotificationService.cs b/src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktopNotificationService.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/VirtualDesktopNotificationService.cs rename to src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktopNotificationService.cs diff --git a/src/VirtualDesktop/Interop/Build10240/VirtualDesktopPinnedApps.cs b/src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktopPinnedApps.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build10240/VirtualDesktopPinnedApps.cs rename to src/VirtualDesktop/Interop/Build10240_0000/VirtualDesktopPinnedApps.cs diff --git a/src/VirtualDesktop/Interop/Build22000/.Provider.cs b/src/VirtualDesktop/Interop/Build22000_0000/.Provider.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build22000/.Provider.cs rename to src/VirtualDesktop/Interop/Build22000_0000/.Provider.cs diff --git a/src/VirtualDesktop/Interop/Build22000/.interfaces/IVirtualDesktop.cs b/src/VirtualDesktop/Interop/Build22000_0000/.interfaces/IVirtualDesktop.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build22000/.interfaces/IVirtualDesktop.cs rename to src/VirtualDesktop/Interop/Build22000_0000/.interfaces/IVirtualDesktop.cs diff --git a/src/VirtualDesktop/Interop/Build22000/.interfaces/IVirtualDesktopManagerInternal.cs b/src/VirtualDesktop/Interop/Build22000_0000/.interfaces/IVirtualDesktopManagerInternal.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build22000/.interfaces/IVirtualDesktopManagerInternal.cs rename to src/VirtualDesktop/Interop/Build22000_0000/.interfaces/IVirtualDesktopManagerInternal.cs diff --git a/src/VirtualDesktop/Interop/Build22000/.interfaces/IVirtualDesktopNotification.cs b/src/VirtualDesktop/Interop/Build22000_0000/.interfaces/IVirtualDesktopNotification.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build22000/.interfaces/IVirtualDesktopNotification.cs rename to src/VirtualDesktop/Interop/Build22000_0000/.interfaces/IVirtualDesktopNotification.cs diff --git a/src/VirtualDesktop/Interop/Build22000/.interfaces/IVirtualDesktopNotificationService.cs b/src/VirtualDesktop/Interop/Build22000_0000/.interfaces/IVirtualDesktopNotificationService.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build22000/.interfaces/IVirtualDesktopNotificationService.cs rename to src/VirtualDesktop/Interop/Build22000_0000/.interfaces/IVirtualDesktopNotificationService.cs diff --git a/src/VirtualDesktop/Interop/Build22000/VirtualDesktop.cs b/src/VirtualDesktop/Interop/Build22000_0000/VirtualDesktop.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build22000/VirtualDesktop.cs rename to src/VirtualDesktop/Interop/Build22000_0000/VirtualDesktop.cs diff --git a/src/VirtualDesktop/Interop/Build22000/VirtualDesktopManagerInternal.cs b/src/VirtualDesktop/Interop/Build22000_0000/VirtualDesktopManagerInternal.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build22000/VirtualDesktopManagerInternal.cs rename to src/VirtualDesktop/Interop/Build22000_0000/VirtualDesktopManagerInternal.cs diff --git a/src/VirtualDesktop/Interop/Build22000/VirtualDesktopNotificationService.cs b/src/VirtualDesktop/Interop/Build22000_0000/VirtualDesktopNotificationService.cs similarity index 100% rename from src/VirtualDesktop/Interop/Build22000/VirtualDesktopNotificationService.cs rename to src/VirtualDesktop/Interop/Build22000_0000/VirtualDesktopNotificationService.cs diff --git a/src/VirtualDesktop/Interop/Build22621_2215/.Provider.cs b/src/VirtualDesktop/Interop/Build22621_2215/.Provider.cs new file mode 100644 index 0000000..628f76d --- /dev/null +++ b/src/VirtualDesktop/Interop/Build22621_2215/.Provider.cs @@ -0,0 +1,47 @@ +using WindowsDesktop.Interop.Build10240; +using WindowsDesktop.Interop.Proxy; + +namespace WindowsDesktop.Interop.Build22621; + +internal class VirtualDesktopProvider22621 : VirtualDesktopProvider +{ + private IVirtualDesktopManager? _virtualDesktopManager; + private ApplicationViewCollection? _applicationViewCollection; + private VirtualDesktopManagerInternal? _virtualDesktopManagerInternal; + private VirtualDesktopPinnedApps? _virtualDesktopPinnedApps; + private VirtualDesktopNotificationService? _virtualDesktopNotificationService; + + public override IApplicationViewCollection ApplicationViewCollection + => this._applicationViewCollection ?? throw InitializationIsRequired; + + public override IVirtualDesktopManager VirtualDesktopManager + => this._virtualDesktopManager ?? throw InitializationIsRequired; + + public override IVirtualDesktopManagerInternal VirtualDesktopManagerInternal + => this._virtualDesktopManagerInternal ?? throw InitializationIsRequired; + + public override IVirtualDesktopPinnedApps VirtualDesktopPinnedApps + => this._virtualDesktopPinnedApps ?? throw InitializationIsRequired; + + public override IVirtualDesktopNotificationService VirtualDesktopNotificationService + => this._virtualDesktopNotificationService ?? throw InitializationIsRequired; + + private protected override void InitializeCore(ComInterfaceAssembly assembly) + { + var type = Type.GetTypeFromCLSID(CLSID.VirtualDesktopManager) + ?? throw new Exception($"No type found for CLSID '{CLSID.VirtualDesktopManager}'."); + this._virtualDesktopManager = Activator.CreateInstance(type) is IVirtualDesktopManager manager + ? manager + : throw new Exception($"Failed to create instance of Type '{typeof(IVirtualDesktopManager)}'."); + + this._applicationViewCollection = new ApplicationViewCollection(assembly); + var factory = new ComWrapperFactory( + x => new ApplicationView(assembly, x), + x => this._applicationViewCollection.GetViewForHwnd(x), + x => new VirtualDesktop(assembly, x)); + this._virtualDesktopManagerInternal = new VirtualDesktopManagerInternal(assembly, factory); + this._virtualDesktopPinnedApps = new VirtualDesktopPinnedApps(assembly, factory); + this._virtualDesktopNotificationService = new VirtualDesktopNotificationService(assembly, factory); + } + +} diff --git a/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktop.cs b/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktop.cs new file mode 100644 index 0000000..ea8ea53 --- /dev/null +++ b/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktop.cs @@ -0,0 +1,24 @@ +using System; +using System.Runtime.InteropServices; +using WindowsDesktop.Interop.Build10240; + +namespace WindowsDesktop.Interop.Build22621 +{ + [ComImport] + [Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IVirtualDesktop + { + bool IsViewVisible(IApplicationView view); + + Guid GetID(); + + HString GetName(); + + HString GetWallpaperPath(); + + bool IsRemote(); + + + } +} diff --git a/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopManagerInternal.cs b/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopManagerInternal.cs new file mode 100644 index 0000000..f67b919 --- /dev/null +++ b/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopManagerInternal.cs @@ -0,0 +1,54 @@ +using System; +using System.Runtime.InteropServices; +using WindowsDesktop.Interop.Build10240; + +namespace WindowsDesktop.Interop.Build22621 +{ + [ComImport] + [Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IVirtualDesktopManagerInternal + { + int GetCount(); + + void MoveViewToDesktop(IApplicationView pView, IVirtualDesktop desktop); + + bool CanViewMoveDesktops(IApplicationView pView); + + IVirtualDesktop GetCurrentDesktop(); + + IObjectArray GetDesktops(); + + IVirtualDesktop GetAdjacentDesktop(IVirtualDesktop pDesktopReference, int uDirection); + + void SwitchDesktop(IVirtualDesktop desktop); + + IVirtualDesktop CreateDesktop(); + + void MoveDesktop(IVirtualDesktop desktop, int nIndex); + + void RemoveDesktop(IVirtualDesktop pRemove, IVirtualDesktop pFallbackDesktop); + + IVirtualDesktop FindDesktop(in Guid desktopId); + + void GetDesktopSwitchIncludeExcludeViews(IVirtualDesktop desktop, out IObjectArray o1, out IObjectArray o2); + + void SetDesktopName(IVirtualDesktop desktop, HString name); + + void SetDesktopWallpaper(IVirtualDesktop desktop, HString path); + + void UpdateWallpaperPathForAllDesktops(HString path); + + void CopyDesktopState(IApplicationView pView0, IApplicationView pView1); + + IVirtualDesktop CreateRemoteDesktop(HString name); + + void SwitchRemoteDesktop(IVirtualDesktop desktop); + + void SwitchDesktopWithAnimation(IVirtualDesktop desktop); + + IVirtualDesktop GetLastActiveDesktop(); + + void WaitForAnimationToComplete(); + } +} diff --git a/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopNotification.cs b/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopNotification.cs new file mode 100644 index 0000000..d3495ab --- /dev/null +++ b/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopNotification.cs @@ -0,0 +1,93 @@ +using System; +using System.Runtime.InteropServices; +using WindowsDesktop.Interop.Build10240; + +namespace WindowsDesktop.Interop.Build22621 +{ + [ComImport] + [Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IVirtualDesktopNotification + { + void VirtualDesktopCreated(IVirtualDesktop pDesktop); + + void VirtualDesktopDestroyBegin(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback); + + void VirtualDesktopDestroyFailed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback); + + void VirtualDesktopDestroyed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback); + + void VirtualDesktopMoved(IVirtualDesktop pDesktop, int nIndexFrom, int nIndexTo); + + void VirtualDesktopRenamed(IVirtualDesktop pDesktop, HString chName); + + void ViewVirtualDesktopChanged(IApplicationView pView); + + void CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew); + + void VirtualDesktopWallpaperChanged(IVirtualDesktop pDesktop, HString chPath); + + IVirtualDesktop VirtualDesktopSwitched(); + + IVirtualDesktop RemoteVirtualDesktopConnected(); + } + + internal class VirtualDesktopNotification : VirtualDesktopNotificationService.EventListenerBase, IVirtualDesktopNotification + { + public void VirtualDesktopCreated(IVirtualDesktop pDesktop) + { + this.CreatedCore(pDesktop); + } + + public void VirtualDesktopDestroyBegin(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback) + { + this.DestroyBeginCore(pDesktopDestroyed, pDesktopFallback); + } + + public void VirtualDesktopDestroyFailed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback) + { + this.DestroyFailedCore(pDesktopDestroyed, pDesktopFallback); + } + + public void VirtualDesktopDestroyed(IVirtualDesktop pDesktopDestroyed, IVirtualDesktop pDesktopFallback) + { + this.DestroyedCore(pDesktopDestroyed, pDesktopFallback); + } + + public void VirtualDesktopMoved(IVirtualDesktop pDesktop, int nIndexFrom, int nIndexTo) + { + this.MovedCore(pDesktop, nIndexFrom, nIndexTo); + } + + public void VirtualDesktopRenamed(IVirtualDesktop pDesktop, HString chName) + { + this.RenamedCore(pDesktop, chName); + } + + public void ViewVirtualDesktopChanged(IApplicationView pView) + { + this.ViewChangedCore(pView); + } + + public void CurrentVirtualDesktopChanged(IVirtualDesktop pDesktopOld, IVirtualDesktop pDesktopNew) + { + this.CurrentChangedCore(pDesktopOld, pDesktopNew); + } + + public void VirtualDesktopWallpaperChanged(IVirtualDesktop pDesktop, HString chPath) + { + this.WallpaperChangedCore(pDesktop, chPath); + } + + public IVirtualDesktop VirtualDesktopSwitched() + { + return this.VirtualDesktopSwitched(); + } + + public IVirtualDesktop RemoteVirtualDesktopConnected() + { + return this.RemoteVirtualDesktopConnected(); + } + + } +} diff --git a/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopNotificationService.cs b/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopNotificationService.cs new file mode 100644 index 0000000..a3d187f --- /dev/null +++ b/src/VirtualDesktop/Interop/Build22621_2215/.interfaces/IVirtualDesktopNotificationService.cs @@ -0,0 +1,15 @@ +using System; +using System.Runtime.InteropServices; + +namespace WindowsDesktop.Interop.Build22621 +{ + [ComImport] + [Guid("00000000-0000-0000-0000-000000000000") /* replace at runtime */] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IVirtualDesktopNotificationService + { + uint Register(IVirtualDesktopNotification pNotification); + + void Unregister(uint dwCookie); + } +} diff --git a/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktop.cs b/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktop.cs new file mode 100644 index 0000000..5c801fb --- /dev/null +++ b/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktop.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using WindowsDesktop.Interop.Proxy; + +namespace WindowsDesktop.Interop.Build22621; + +internal class VirtualDesktop : ComWrapperBase, IVirtualDesktop +{ + private Guid? _id; + + public VirtualDesktop(ComInterfaceAssembly assembly, object comObject) + : base(assembly, comObject) + { + } + + public bool IsViewVisible(IntPtr hWnd) + => this.InvokeMethod(Args(hWnd)); + + public Guid GetID() + => this._id ?? (Guid)(this._id = this.InvokeMethod()); + + public string GetName() + => this.InvokeMethod(); + + public string GetWallpaperPath() + => this.InvokeMethod(); + + public bool IsRemote() + => this.InvokeMethod(); +} diff --git a/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktopManagerInternal.cs b/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktopManagerInternal.cs new file mode 100644 index 0000000..bd80531 --- /dev/null +++ b/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktopManagerInternal.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using WindowsDesktop.Interop.Proxy; + +namespace WindowsDesktop.Interop.Build22621; + +internal class VirtualDesktopManagerInternal : ComWrapperBase, IVirtualDesktopManagerInternal +{ + private readonly ComWrapperFactory _factory; + + public VirtualDesktopManagerInternal(ComInterfaceAssembly assembly, ComWrapperFactory factory) + : base(assembly, CLSID.VirtualDesktopManagerInternal) + { + this._factory = factory; + } + + public IEnumerable GetDesktops() + { + var array = this.InvokeMethod(); + if (array == null) yield break; + + var count = array.GetCount(); + var vdType = this.ComInterfaceAssembly.GetType(nameof(IVirtualDesktop)); + + for (var i = 0u; i < count; i++) + { + var ppvObject = array.GetAt(i, vdType.GUID); + yield return new VirtualDesktop(this.ComInterfaceAssembly, ppvObject); + } + } + + public IVirtualDesktop GetCurrentDesktop() + => this.InvokeMethodAndWrap(); + + public IVirtualDesktop GetAdjacentDesktop(IVirtualDesktop pDesktopReference, AdjacentDesktop uDirection) + => this.InvokeMethodAndWrap(Args(((VirtualDesktop)pDesktopReference).ComObject, uDirection)); + + public IVirtualDesktop FindDesktop(Guid desktopId) + => this.InvokeMethodAndWrap(Args(desktopId)); + + public IVirtualDesktop CreateDesktop() + => this.InvokeMethodAndWrap(); + + public void SwitchDesktop(IVirtualDesktop desktop) + => this.InvokeMethod(Args(((VirtualDesktop)desktop).ComObject)); + + public void RemoveDesktop(IVirtualDesktop pRemove, IVirtualDesktop pFallbackDesktop) + => this.InvokeMethod(Args(((VirtualDesktop)pRemove).ComObject, ((VirtualDesktop)pFallbackDesktop).ComObject)); + + public void MoveViewToDesktop(IntPtr hWnd, IVirtualDesktop desktop) + => this.InvokeMethod(Args(this._factory.ApplicationViewFromHwnd(hWnd).ComObject, ((VirtualDesktop)desktop).ComObject)); + + public void SetDesktopName(IVirtualDesktop desktop, string name) + => this.InvokeMethod(Args(((VirtualDesktop)desktop).ComObject, new HString(name))); + + public void SetDesktopWallpaper(IVirtualDesktop desktop, string path) + => this.InvokeMethod(Args(((VirtualDesktop)desktop).ComObject, new HString(path))); + + public void UpdateWallpaperPathForAllDesktops(string path) + => this.InvokeMethod(Args(new HString(path))); + + private VirtualDesktop InvokeMethodAndWrap(object?[]? parameters = null, [CallerMemberName] string methodName = "") + => new(this.ComInterfaceAssembly, this.InvokeMethod(parameters, methodName) ?? throw new Exception("Failed to get IVirtualDesktop instance.")); +} diff --git a/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktopNotificationService.cs b/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktopNotificationService.cs new file mode 100644 index 0000000..c17641b --- /dev/null +++ b/src/VirtualDesktop/Interop/Build22621_2215/VirtualDesktopNotificationService.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using WindowsDesktop.Interop.Proxy; +using WindowsDesktop.Utils; + +namespace WindowsDesktop.Interop.Build22621; + +public class VirtualDesktopNotificationService : ComWrapperBase, IVirtualDesktopNotificationService +{ + private readonly ComWrapperFactory _factory; + + internal VirtualDesktopNotificationService(ComInterfaceAssembly assembly, ComWrapperFactory factory) + : base(assembly, CLSID.VirtualDesktopNotificationService) + { + this._factory = factory; + } + + public IDisposable Register(IVirtualDesktopNotification notification) + { + var type = this.ComInterfaceAssembly.GetType("VirtualDesktopNotification"); + var listener = Activator.CreateInstance(type) as EventListenerBase + ?? throw new Exception($"{nameof(EventListenerBase)} inheritance type is not found in the COM interface assembly."); + + listener.Notification = notification; + listener.Factory = this._factory; + + var dwCookie = this.InvokeMethod(Args(listener)); + return Disposable.Create(() => this.Unregister(dwCookie)); + } + + private void Unregister(uint dwCookie) + { + try + { + this.InvokeMethod(Args(dwCookie)); + } + catch (COMException ex) when (ex.Match(HResult.RPC_S_SERVER_UNAVAILABLE)) + { + // Nothing particular to do. + } + } + + public abstract class EventListenerBase + { + internal ComWrapperFactory Factory { get; set; } = null!; + + internal IVirtualDesktopNotification Notification { get; set; } = null!; + + protected void CreatedCore(object pDesktop) + => this.Notification.VirtualDesktopCreated(this.Wrap(pDesktop)); + + protected void DestroyBeginCore(object pDesktopDestroyed, object pDesktopFallback) + => this.Notification.VirtualDesktopDestroyBegin(this.Wrap(pDesktopDestroyed), this.Wrap(pDesktopFallback)); + + protected void DestroyFailedCore(object pDesktopDestroyed, object pDesktopFallback) + => this.Notification.VirtualDesktopDestroyFailed(this.Wrap(pDesktopDestroyed), this.Wrap(pDesktopFallback)); + + protected void DestroyedCore(object pDesktopDestroyed, object pDesktopFallback) + => this.Notification.VirtualDesktopDestroyed(this.Wrap(pDesktopDestroyed), this.Wrap(pDesktopFallback)); + + protected void MovedCore(object pDesktop, int nIndexFrom, int nIndexTo) + => this.Notification.VirtualDesktopMoved(this.Wrap(pDesktop), nIndexFrom, nIndexTo); + + protected void RenamedCore(object pDesktop, HString chName) + => this.Notification.VirtualDesktopRenamed(this.Wrap(pDesktop), chName); + + protected void ViewChangedCore(object view) + => this.Notification.ViewVirtualDesktopChanged(this.Factory.ApplicationView(view).Interface); + + protected void CurrentChangedCore(object pDesktopOld, object pDesktopNew) + => this.Notification.CurrentVirtualDesktopChanged(this.Wrap(pDesktopOld), this.Wrap(pDesktopNew)); + + protected void WallpaperChangedCore(object pDesktop, HString chPath) + => this.Notification.VirtualDesktopWallpaperChanged(this.Wrap(pDesktop), chPath); + + private IVirtualDesktop Wrap(object desktop) + => this.Factory.VirtualDesktop(desktop).Interface; + } +} diff --git a/src/VirtualDesktop/Interop/ComInterfaceAssemblyBuilder.cs b/src/VirtualDesktop/Interop/ComInterfaceAssemblyBuilder.cs index 8aa686e..b2bd8cb 100644 --- a/src/VirtualDesktop/Interop/ComInterfaceAssemblyBuilder.cs +++ b/src/VirtualDesktop/Interop/ComInterfaceAssemblyBuilder.cs @@ -9,7 +9,9 @@ using System.Text.RegularExpressions; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.Win32; using WindowsDesktop.Properties; +using WindowsDesktop.Utils; namespace WindowsDesktop.Interop; @@ -20,10 +22,11 @@ internal class ComInterfaceAssemblyBuilder private const string _placeholderAssemblyVersion = "{ASSEMBLY_VERSION}"; private const string _placeholderInterfaceId = "00000000-0000-0000-0000-000000000000"; - private static readonly Version _requireVersion = new("2.1.0"); - private static readonly Regex _assemblyRegex = new(@"VirtualDesktop\.(?\d{5}?)(\.\w*|)\.dll"); - private static readonly Regex _buildNumberRegex = new(@"\.Build(?\d{5})\."); - private static readonly int _osBuild = Environment.OSVersion.Version.Build; + // TODO: Increment that to force assembly to be regenerated + private static readonly Version _requireVersion = new("2.2.1"); + private static readonly Regex _assemblyRegex = new(@"VirtualDesktop\.(?\d{5}\.\d{4}?)(\.\w*|)\.dll"); + private static readonly Regex _buildNumberRegex = new(@"\.Build(?\d{5}\.\d{4})\."); + private static readonly double osBuild = OS.Build(); private static ComInterfaceAssembly? _assembly; private readonly VirtualDesktopCompilerConfiguration _configuration; @@ -42,8 +45,8 @@ public ComInterfaceAssembly GetAssembly() { foreach (var file in this._configuration.CompiledAssemblySaveDirectory.GetFiles()) { - if (int.TryParse(_assemblyRegex.Match(file.Name).Groups["build"].ToString(), out var build) - && build == _osBuild) + if (double.TryParse(_assemblyRegex.Match(file.Name).Groups["build"].ToString(), out var build) + && build == osBuild) { try { @@ -82,7 +85,7 @@ private Assembly CreateAssembly() using var reader = new StreamReader(stream, Encoding.UTF8); var sourceCode = reader .ReadToEnd() - .Replace(_placeholderOsBuild, _osBuild.ToString()) + .Replace(_placeholderOsBuild, osBuild.ToString()) .Replace(_placeholderAssemblyVersion, _requireVersion.ToString(3)); compileTargets.Add(sourceCode); } @@ -102,18 +105,18 @@ private Assembly CreateAssembly() // └── 22000, VirtualDesktop.Interop.Build22000..interfaces.IVirtualDesktop.cs // IVirtualDesktopPinnedApps // └── 10240, VirtualDesktop.Interop.Build10240..interfaces.IVirtualDesktopPinnedApps.cs - var interfaceSourceFiles = new Dictionary>(); + var interfaceSourceFiles = new Dictionary>(); foreach (var name in executingAssembly.GetManifestResourceNames()) { var interfaceName = Path.GetFileNameWithoutExtension(name).Split('.').LastOrDefault(); if (interfaceName != null && interfaceNames.Contains(interfaceName) - && int.TryParse(_buildNumberRegex.Match(name).Groups["build"].ToString(), out var build)) + && double.TryParse(_buildNumberRegex.Match(name.Replace('_','.')).Groups["build"].ToString(), out var build)) { if (interfaceSourceFiles.TryGetValue(interfaceName, out var sourceFiles) == false) { - sourceFiles = new SortedList(); + sourceFiles = new SortedList(); interfaceSourceFiles.Add(interfaceName, sourceFiles); } @@ -126,7 +129,7 @@ private Assembly CreateAssembly() var resourceName = sourceFiles.Aggregate("", (current, kvp) => { var (build, resourceName) = kvp; - return build <= _osBuild ? resourceName : current; + return build <= osBuild ? resourceName : current; }); var stream = executingAssembly.GetManifestResourceStream(resourceName); @@ -144,7 +147,7 @@ private Assembly Compile(IEnumerable sources) { try { - var name = string.Format(_assemblyName, _osBuild); + var name = string.Format(_assemblyName, osBuild); var syntaxTrees = sources.Select(x => SyntaxFactory.ParseSyntaxTree(x)); var references = AppDomain.CurrentDomain.GetAssemblies() .Concat(new[] { Assembly.GetExecutingAssembly(), }) diff --git a/src/VirtualDesktop/Interop/IID.cs b/src/VirtualDesktop/Interop/IID.cs index 75b7fa1..3befe79 100644 --- a/src/VirtualDesktop/Interop/IID.cs +++ b/src/VirtualDesktop/Interop/IID.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Configuration; @@ -6,16 +6,18 @@ using System.Text.RegularExpressions; using WindowsDesktop.Properties; using Microsoft.Win32; +using System.Globalization; +using WindowsDesktop.Utils; namespace WindowsDesktop.Interop; internal record OsBuildSettings( - int osBuild, + double osBuild, SettingsProperty prop); internal static class IID { - private static readonly Regex _osBuildRegex = new(@"v_(?\d{5}?)"); + private static readonly Regex _osBuildRegex = new(@"v_(?\d{5}_\d{4}?)"); // ReSharper disable once InconsistentNaming public static Dictionary GetIIDs(string[] interfaceNames) @@ -26,7 +28,7 @@ public static Dictionary GetIIDs(string[] interfaceNames) var orderedProps = Settings.Default.Properties.OfType() .Select(prop => { - if (int.TryParse(_osBuildRegex.Match(prop.Name).Groups["build"].ToString(), out var build)) + if (double.TryParse(_osBuildRegex.Match(prop.Name).Groups["build"].ToString().Replace('_','.'), NumberStyles.Any, CultureInfo.InvariantCulture, out var build)) { return new OsBuildSettings(build, prop); } @@ -39,7 +41,7 @@ public static Dictionary GetIIDs(string[] interfaceNames) // Find first prop with build version <= current OS version var selectedSettings = orderedProps.FirstOrDefault(p => - p.osBuild <= Environment.OSVersion.Version.Build + p.osBuild <= OS.Build() ); if (selectedSettings == null) @@ -47,7 +49,7 @@ public static Dictionary GetIIDs(string[] interfaceNames) var supportedBuilds = orderedProps.Select(v => v.osBuild).ToArray(); throw new ConfigurationException( "Invalid application configuration. Unable to determine interop interfaces for " + - $"current OS Build: {Environment.OSVersion.Version.Build}. All configured OS Builds " + + $"current OS Build: {OS.Build()}. All configured OS Builds " + $"have build version greater than current OS: {supportedBuilds}"); } diff --git a/src/VirtualDesktop/Properties/Settings.Designer.cs b/src/VirtualDesktop/Properties/Settings.Designer.cs index 24a96c8..8486e39 100644 --- a/src/VirtualDesktop/Properties/Settings.Designer.cs +++ b/src/VirtualDesktop/Properties/Settings.Designer.cs @@ -27,7 +27,7 @@ public static Settings Default { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute(@" - IApplicationView,{871F602A-2B58-42B4-8C4B-6C43D642C06F} + IApplicationView,{9AC0B5C8-1484-4C5B-9533-4134A0F97CEA} IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} @@ -38,9 +38,9 @@ public static Settings Default { IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} ")] - public global::System.Collections.Specialized.StringCollection v_17134 { + public global::System.Collections.Specialized.StringCollection v_16299_0000 { get { - return ((global::System.Collections.Specialized.StringCollection)(this["v_17134"])); + return ((global::System.Collections.Specialized.StringCollection)(this["v_16299_0000"])); } } @@ -48,20 +48,20 @@ public static Settings Default { [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute(@" - IApplicationView,{9AC0B5C8-1484-4C5B-9533-4134A0F97CEA} - IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} - IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} - IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} - IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} - IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} - IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} - IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} - IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} - IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} + IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} + IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} + IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} + IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} + IVirtualDesktop,{536D3495-B208-4CC9-AE26-DE8111275BF8} + IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} + IVirtualDesktopManagerInternal,{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10} + IVirtualDesktopNotification,{cd403e52-deed-4c13-b437-b98380f2b1e8} + IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf} + IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} ")] - public global::System.Collections.Specialized.StringCollection v_16299 { + public global::System.Collections.Specialized.StringCollection v_22000_0000 { get { - return ((global::System.Collections.Specialized.StringCollection)(this["v_16299"])); + return ((global::System.Collections.Specialized.StringCollection)(this["v_22000_0000"])); } } @@ -80,9 +80,9 @@ public static Settings Default { IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf} IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} ")] - public global::System.Collections.Specialized.StringCollection v_22000 { + public global::System.Collections.Specialized.StringCollection v_22621_0000 { get { - return ((global::System.Collections.Specialized.StringCollection)(this["v_22000"])); + return ((global::System.Collections.Specialized.StringCollection)(this["v_22621_0000"])); } } @@ -94,16 +94,16 @@ public static Settings Default { IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} - IVirtualDesktop,{536D3495-B208-4CC9-AE26-DE8111275BF8} + IVirtualDesktop,{3F07F4BE-B107-441A-AF0F-39D82529072C} IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} - IVirtualDesktopManagerInternal,{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10} - IVirtualDesktopNotification,{cd403e52-deed-4c13-b437-b98380f2b1e8} + IVirtualDesktopManagerInternal,{A3175F2D-239C-4BD2-8AA0-EEBA8B0B138E} + IVirtualDesktopNotification,{B287FA1C-7771-471A-A2DF-9B6B21F0D675} IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf} IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} ")] - public global::System.Collections.Specialized.StringCollection v_22621 { + public global::System.Collections.Specialized.StringCollection v_22621_2215 { get { - return ((global::System.Collections.Specialized.StringCollection)(this["v_22621"])); + return ((global::System.Collections.Specialized.StringCollection)(this["v_22621_2215"])); } } @@ -122,9 +122,30 @@ public static Settings Default { IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} ")] - public global::System.Collections.Specialized.StringCollection v_19045 { + public global::System.Collections.Specialized.StringCollection v_19045_0000 { + get { + return ((global::System.Collections.Specialized.StringCollection)(this["v_19045_0000"])); + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute(@" + + IApplicationView,{871F602A-2B58-42B4-8C4B-6C43D642C06F} + IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} + IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} + IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} + IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} + IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} + IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} + IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} + IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} + IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} +")] + public global::System.Collections.Specialized.StringCollection v_17134_0000 { get { - return ((global::System.Collections.Specialized.StringCollection)(this["v_19045"])); + return ((global::System.Collections.Specialized.StringCollection)(this["v_17134_0000"])); } } } diff --git a/src/VirtualDesktop/Properties/Settings.settings b/src/VirtualDesktop/Properties/Settings.settings index 9f7b1dd..f64844d 100644 --- a/src/VirtualDesktop/Properties/Settings.settings +++ b/src/VirtualDesktop/Properties/Settings.settings @@ -2,22 +2,7 @@ - - <?xml version="1.0" encoding="utf-16"?> -<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <string>IApplicationView,{871F602A-2B58-42B4-8C4B-6C43D642C06F}</string> - <string>IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} </string> - <string>IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} </string> - <string>IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} </string> - <string>IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} </string> - <string>IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} </string> - <string>IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} </string> - <string>IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} </string> - <string>IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} </string> - <string>IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} </string> -</ArrayOfString> - - + <?xml version="1.0" encoding="utf-16"?> <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <string>IApplicationView,{9AC0B5C8-1484-4C5B-9533-4134A0F97CEA} </string> @@ -32,7 +17,7 @@ <string>IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} </string> </ArrayOfString> - + <?xml version="1.0" encoding="utf-16"?> <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <string>IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513}</string> @@ -47,7 +32,7 @@ <string>IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F}</string> </ArrayOfString> - + <?xml version="1.0" encoding="utf-16"?> <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <string>IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513}</string> @@ -62,7 +47,22 @@ <string>IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F}</string> </ArrayOfString> - + + <?xml version="1.0" encoding="utf-16"?> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <string>IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513}</string> + <string>IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5}</string> + <string>IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9}</string> + <string>IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA}</string> + <string>IVirtualDesktop,{3F07F4BE-B107-441A-AF0F-39D82529072C}</string> + <string>IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B}</string> + <string>IVirtualDesktopManagerInternal,{A3175F2D-239C-4BD2-8AA0-EEBA8B0B138E}</string> + <string>IVirtualDesktopNotification,{B287FA1C-7771-471A-A2DF-9B6B21F0D675}</string> + <string>IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf}</string> + <string>IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F}</string> +</ArrayOfString> + + <?xml version="1.0" encoding="utf-16"?> <ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <string>IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} </string> @@ -75,6 +75,21 @@ <string>IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} </string> <string>IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} </string> <string>IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} </string> +</ArrayOfString> + + + <?xml version="1.0" encoding="utf-16"?> +<ArrayOfString xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <string>IApplicationView,{871F602A-2B58-42B4-8C4B-6C43D642C06F}</string> + <string>IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} </string> + <string>IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} </string> + <string>IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} </string> + <string>IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} </string> + <string>IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} </string> + <string>IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} </string> + <string>IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} </string> + <string>IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} </string> + <string>IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} </string> </ArrayOfString> diff --git a/src/VirtualDesktop/Utils/OS.cs b/src/VirtualDesktop/Utils/OS.cs new file mode 100644 index 0000000..2713094 --- /dev/null +++ b/src/VirtualDesktop/Utils/OS.cs @@ -0,0 +1,24 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WindowsDesktop.Utils +{ + internal class OS + { + /// + /// Return the OS Build number such as: 22621.2215 + /// + /// + public static double Build() + { + int _osBuild = Environment.OSVersion.Version.Build; + int _osRevision = int.Parse(Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion").GetValue("UBR").ToString()); + double _osId = _osBuild + (_osRevision / 10000d); + return _osId; + } + } +} diff --git a/src/VirtualDesktop/VirtualDesktop.csproj b/src/VirtualDesktop/VirtualDesktop.csproj index 3f3499d..b65dda8 100644 --- a/src/VirtualDesktop/VirtualDesktop.csproj +++ b/src/VirtualDesktop/VirtualDesktop.csproj @@ -46,19 +46,23 @@ + + + + - - - - - - - - - - - - + + + + + + + + + + + + True @@ -78,6 +82,9 @@ True Settings.settings + + + SettingsSingleFileGenerator Settings.Designer.cs diff --git a/src/VirtualDesktop/VirtualDesktop.system.cs b/src/VirtualDesktop/VirtualDesktop.system.cs index 6dcadf6..7fa15be 100644 --- a/src/VirtualDesktop/VirtualDesktop.system.cs +++ b/src/VirtualDesktop/VirtualDesktop.system.cs @@ -7,6 +7,7 @@ using WindowsDesktop.Interop; using WindowsDesktop.Interop.Build10240; using WindowsDesktop.Interop.Build22000; +using WindowsDesktop.Interop.Build22621; using WindowsDesktop.Interop.Proxy; using WindowsDesktop.Properties; using WindowsDesktop.Utils; @@ -33,8 +34,9 @@ public static bool IsSupported static VirtualDesktop() { - _provider = Environment.OSVersion.Version.Build switch + _provider = OS.Build() switch { + >= 22621.2215 => new VirtualDesktopProvider22621(), >= 22000 => new VirtualDesktopProvider22000(), >= 10240 => new VirtualDesktopProvider10240(), _ => new VirtualDesktopProvider.NotSupported() @@ -42,7 +44,7 @@ static VirtualDesktop() Debug.WriteLine($"*** {AssemblyInfo.Title} Library ***"); Debug.WriteLine($"Version: {AssemblyInfo.VersionString}"); - Debug.WriteLine($"OS Build: {Environment.OSVersion.Version.Build}"); + Debug.WriteLine($"OS Build: {OS.Build()}"); Debug.WriteLine($"Provider: {_provider.GetType().Name}"); } diff --git a/src/VirtualDesktop/app.config b/src/VirtualDesktop/app.config index fef05e0..2f0124f 100644 --- a/src/VirtualDesktop/app.config +++ b/src/VirtualDesktop/app.config @@ -1,92 +1,108 @@  - - -
- - - - - - - - IApplicationView,{871F602A-2B58-42B4-8C4B-6C43D642C06F} - IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} - IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} - IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} - IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} - IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} - IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} - IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} - IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} - IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} - - - - - - - IApplicationView,{9AC0B5C8-1484-4C5B-9533-4134A0F97CEA} - IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} - IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} - IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} - IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} - IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} - IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} - IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} - IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} - IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} - - - - - - - IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} - IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} - IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} - IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} - IVirtualDesktop,{536D3495-B208-4CC9-AE26-DE8111275BF8} - IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} - IVirtualDesktopManagerInternal,{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10} - IVirtualDesktopNotification,{cd403e52-deed-4c13-b437-b98380f2b1e8} - IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf} - IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} - - - - - - - IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} - IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} - IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} - IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} - IVirtualDesktop,{536D3495-B208-4CC9-AE26-DE8111275BF8} - IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} - IVirtualDesktopManagerInternal,{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10} - IVirtualDesktopNotification,{cd403e52-deed-4c13-b437-b98380f2b1e8} - IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf} - IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} - - - - - - - IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} - IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} - IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} - IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} - IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} - IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} - IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} - IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} - IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} - IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} - - - - - + + +
+ + + + + + + + IApplicationView,{871F602A-2B58-42B4-8C4B-6C43D642C06F} + IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} + IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} + IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} + IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} + IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} + IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} + IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} + IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} + IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} + + + + + + + IApplicationView,{9AC0B5C8-1484-4C5B-9533-4134A0F97CEA} + IApplicationViewCollection,{2C08ADF0-A386-4B35-9250-0FE183476FCC} + IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} + IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} + IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} + IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} + IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} + IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} + IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} + IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} + + + + + + + IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} + IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} + IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} + IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} + IVirtualDesktop,{536D3495-B208-4CC9-AE26-DE8111275BF8} + IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} + IVirtualDesktopManagerInternal,{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10} + IVirtualDesktopNotification,{cd403e52-deed-4c13-b437-b98380f2b1e8} + IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf} + IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} + + + + + + + IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} + IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} + IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} + IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} + IVirtualDesktop,{536D3495-B208-4CC9-AE26-DE8111275BF8} + IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} + IVirtualDesktopManagerInternal,{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10} + IVirtualDesktopNotification,{cd403e52-deed-4c13-b437-b98380f2b1e8} + IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf} + IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} + + + + + + + IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} + IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} + IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} + IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} + IVirtualDesktop,{3F07F4BE-B107-441A-AF0F-39D82529072C} + IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} + IVirtualDesktopManagerInternal,{A3175F2D-239C-4BD2-8AA0-EEBA8B0B138E} + IVirtualDesktopNotification,{B287FA1C-7771-471A-A2DF-9B6B21F0D675} + IVirtualDesktopNotificationService,{0cd45e71-d927-4f15-8b0a-8fef525337bf} + IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} + + + + + + + IApplicationView,{372E1D3B-38D3-42E4-A15B-8AB2B178F513} + IApplicationViewCollection,{1841C6D7-4F9D-42C0-AF41-8747538F10E5} + IObjectArray,{92CA9DCD-5622-4BBA-A805-5E9F541BD8C9} + IServiceProvider,{6D5140C1-7436-11CE-8034-00AA006009FA} + IVirtualDesktop,{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4} + IVirtualDesktopManager,{A5CD92FF-29BE-454C-8D04-D82879FB3F1B} + IVirtualDesktopManagerInternal,{F31574D6-B682-4CDC-BD56-1827860ABEC6} + IVirtualDesktopNotification,{C179334C-4295-40D3-BEA1-C654D965605A} + IVirtualDesktopNotificationService,{0CD45E71-D927-4F15-8B0A-8FEF525337BF} + IVirtualDesktopPinnedApps,{4CE81583-1E4C-4632-A621-07A53543148F} + + + + + \ No newline at end of file