PersistentWindows/Ninjacrab.PersistentWindows.Solution/Common/VirtualDesktop.cs
2023-07-15 17:28:02 -07:00

81 lines
2.4 KiB
C#

using System;
using System.Runtime.InteropServices;
using PersistentWindows.Common.Diagnostics;
namespace PersistentWindows.Common
{
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("a5cd92ff-29be-454c-8d04-d82879fb3f1b")]
internal interface IVirtualDesktopManager
{
[PreserveSig]
int IsWindowOnCurrentVirtualDesktop([In] IntPtr TopLevelWindow, [Out] out int OnCurrentDesktop);
[PreserveSig]
int GetWindowDesktopId([In] IntPtr TopLevelWindow, [Out] out Guid CurrentDesktop);
[PreserveSig]
int MoveWindowToDesktop([In] IntPtr TopLevelWindow, [MarshalAs(UnmanagedType.LPStruct)][In] Guid CurrentDesktop);
}
[ComImport, Guid("aa509086-5ca9-4c25-8f95-589d3c07b48a")]
internal class CVirtualDesktopManager
{
}
public class VirtualDesktop
{
private static IVirtualDesktopManager _manager = null;
public VirtualDesktop()
{
try
{
_manager = (IVirtualDesktopManager)new CVirtualDesktopManager();
}
catch
{
Log.Error("VirtualDesktop feature not supported by OS");
}
}
public bool Enabled()
{
return _manager != null;
}
public bool IsWindowOnCurrentVirtualDesktop(IntPtr TopLevelWindow)
{
int hr = _manager.IsWindowOnCurrentVirtualDesktop(TopLevelWindow, out int result);
if (hr != 0)
{
//Marshal.ThrowExceptionForHR(hr);
Log.Error("IsWindowOnCurrentVirtualDesktop() call failed");
}
return result != 0;
}
public Guid GetWindowDesktopId(IntPtr TopLevelWindow)
{
int hr = _manager.GetWindowDesktopId(TopLevelWindow, out Guid result);
if (hr != 0)
{
//Marshal.ThrowExceptionForHR(hr);
Log.Error("GetWindowDesktopId() call failed");
}
return result;
}
public void MoveWindowToDesktop(IntPtr TopLevelWindow, Guid CurrentDesktop)
{
int hr = _manager.MoveWindowToDesktop(TopLevelWindow, CurrentDesktop);
if (hr != 0)
{
//Marshal.ThrowExceptionForHR(hr);
Log.Error("MoveWindowToDesktop() call failed");
}
}
}
}