diff --git a/source/VirtualDesktop/ApplicationHelper.cs b/source/VirtualDesktop/ApplicationHelper.cs index 593a601..06d230e 100644 --- a/source/VirtualDesktop/ApplicationHelper.cs +++ b/source/VirtualDesktop/ApplicationHelper.cs @@ -9,16 +9,29 @@ public static class ApplicationHelper { internal static IApplicationView GetApplicationView(this IntPtr hWnd) { - IApplicationView view; - ComObjects.ApplicationViewCollection.GetViewForHwnd(hWnd, out view); - - return view; + try + { + IApplicationView view; + ComObjects.ApplicationViewCollection.GetViewForHwnd(hWnd, out view); + return view; + } + catch (System.Runtime.InteropServices.COMException ex) when (ex.Match(HResult.TYPE_E_ELEMENTNOTFOUND)) + { + return null; + } } public static string GetAppId(IntPtr hWnd) { + var view = hWnd.GetApplicationView(); + + if (view == null) + { + throw new ArgumentException(nameof(hWnd)); + } + string appId; - hWnd.GetApplicationView().GetAppUserModelId(out appId); + view.GetAppUserModelId(out appId); return appId; } diff --git a/source/VirtualDesktop/VirtualDesktop.static.pin.cs b/source/VirtualDesktop/VirtualDesktop.static.pin.cs index 6a3aaa6..aac6eb1 100644 --- a/source/VirtualDesktop/VirtualDesktop.static.pin.cs +++ b/source/VirtualDesktop/VirtualDesktop.static.pin.cs @@ -11,7 +11,14 @@ public static bool IsPinnedWindow(IntPtr hWnd) { VirtualDesktopHelper.ThrowIfNotSupported(); - return ComObjects.VirtualDesktopPinnedApps.IsViewPinned(hWnd.GetApplicationView()); + var view = hWnd.GetApplicationView(); + + if (view == null) + { + throw new ArgumentException(nameof(hWnd)); + } + + return ComObjects.VirtualDesktopPinnedApps.IsViewPinned(view); } public static void PinWindow(IntPtr hWnd) @@ -20,6 +27,11 @@ public static void PinWindow(IntPtr hWnd) var view = hWnd.GetApplicationView(); + if (view == null) + { + throw new ArgumentException(nameof(hWnd)); + } + if (!ComObjects.VirtualDesktopPinnedApps.IsViewPinned(view)) { ComObjects.VirtualDesktopPinnedApps.PinView(view); @@ -32,10 +44,36 @@ public static void UnpinWindow(IntPtr hWnd) var view = hWnd.GetApplicationView(); + if (view == null) + { + throw new ArgumentException(nameof(hWnd)); + } + + if (ComObjects.VirtualDesktopPinnedApps.IsViewPinned(view)) + { + ComObjects.VirtualDesktopPinnedApps.UnpinView(view); + } + } + + public static void TogglePinWindow(IntPtr hWnd) + { + VirtualDesktopHelper.ThrowIfNotSupported(); + + var view = hWnd.GetApplicationView(); + + if (view == null) + { + throw new ArgumentException(nameof(hWnd)); + } + if (ComObjects.VirtualDesktopPinnedApps.IsViewPinned(view)) { ComObjects.VirtualDesktopPinnedApps.UnpinView(view); } + else + { + ComObjects.VirtualDesktopPinnedApps.PinView(view); + } } public static bool IsPinnedApplication(string appId) @@ -64,5 +102,19 @@ public static void UnpinApplication(string appId) ComObjects.VirtualDesktopPinnedApps.UnpinAppID(appId); } } + + public static void TogglePinApplication(string appId) + { + VirtualDesktopHelper.ThrowIfNotSupported(); + + if (ComObjects.VirtualDesktopPinnedApps.IsAppIdPinned(appId)) + { + ComObjects.VirtualDesktopPinnedApps.UnpinAppID(appId); + } + else + { + ComObjects.VirtualDesktopPinnedApps.PinAppID(appId); + } + } } } diff --git a/source/VirtualDesktop/VirtualDesktopHelper.cs b/source/VirtualDesktop/VirtualDesktopHelper.cs index 11408f3..046163b 100644 --- a/source/VirtualDesktop/VirtualDesktopHelper.cs +++ b/source/VirtualDesktop/VirtualDesktopHelper.cs @@ -36,9 +36,16 @@ public static void MoveToDesktop(IntPtr hWnd, VirtualDesktop virtualDesktop) } else { - IApplicationView view; - ComObjects.ApplicationViewCollection.GetViewForHwnd(hWnd, out view); - ComObjects.VirtualDesktopManagerInternal.MoveViewToDesktop(view, virtualDesktop.ComObject); + try + { + IApplicationView view; + ComObjects.ApplicationViewCollection.GetViewForHwnd(hWnd, out view); + ComObjects.VirtualDesktopManagerInternal.MoveViewToDesktop(view, virtualDesktop.ComObject); + } + catch (System.Runtime.InteropServices.COMException ex) when (ex.Match(HResult.TYPE_E_ELEMENTNOTFOUND)) + { + throw new ArgumentException(nameof(hWnd)); + } } } }