windows-10 - varios - personalizar escritorios virtuales windows 10
API para escritorios virtuales de Windows 10 (3)
¿Hay alguna forma de enumerar, cambiar, agregar escritorios virtuales y mover la ventana entre escritorios desde el código? Preferiblemente, WinAPI.
El blog del equipo de soporte de SDK de Windows publicó una demostración de C # para cambiar los escritorios a través de IVirtualDesktopManager:
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("a5cd92ff-29be-454c-8d04-d82879fb3f1b")]
[System.Security.SuppressUnmanagedCodeSecurity]
public 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")]
public class CVirtualDesktopManager
{
}
public class VirtualDesktopManager
{
public VirtualDesktopManager()
{
cmanager = new CVirtualDesktopManager();
manager = (IVirtualDesktopManager)cmanager;
}
~VirtualDesktopManager()
{
manager = null;
cmanager = null;
}
private CVirtualDesktopManager cmanager = null;
private IVirtualDesktopManager manager;
public bool IsWindowOnCurrentVirtualDesktop(IntPtr TopLevelWindow)
{
int result;
int hr;
if ((hr = manager.IsWindowOnCurrentVirtualDesktop(TopLevelWindow, out result)) != 0)
{
Marshal.ThrowExceptionForHR(hr);
}
return result != 0;
}
public Guid GetWindowDesktopId(IntPtr TopLevelWindow)
{
Guid result;
int hr;
if ((hr = manager.GetWindowDesktopId(TopLevelWindow, out result)) != 0)
{
Marshal.ThrowExceptionForHR(hr);
}
return result;
}
public void MoveWindowToDesktop(IntPtr TopLevelWindow, Guid CurrentDesktop)
{
int hr;
if ((hr = manager.MoveWindowToDesktop(TopLevelWindow, CurrentDesktop)) != 0)
{
Marshal.ThrowExceptionForHR(hr);
}
}
}
incluye la API para detectar en qué escritorio se muestra la ventana y puede cambiar y mover un Windows a un Escritorio.
Hay un tipo que hizo una aplicación para mapear el teclado del teclado para mover una ventana entre el escritorio virtual. https://github.com/Grabacr07/SylphyHorn (lo uso todos los días)
Tiene un blog donde explica lo que hizo http://grabacr.net/archives/5701 (puede usar el traductor de google que está en japonés)
De hecho, utilizó la misma API que se utilizó en la respuesta de Alberto Tostado. http://www.cyberforum.ru/blogs/105416/blog3671.html y la api se puede encontrar en su github https://github.com/Grabacr07/VirtualDesktop
La API es realmente fácil de usar PERO parece imposible mover una ventana de otro proceso.
public static bool MoveToDesktop(IntPtr hWnd, VirtualDesktop virtualDesktop)
{
ThrowIfNotSupported();
int processId;
NativeMethods.GetWindowThreadProcessId(hWnd, out processId);
if (Process.GetCurrentProcess().Id == processId) // THAT LINE
{
var guid = virtualDesktop.Id;
VirtualDesktop.ComManager.MoveWindowToDesktop(hWnd, ref guid);
return true;
}
return false;
}
Para solucionar este problema, hicieron otra implementación que usan junto con la del blog ruso
if (VirtualDesktopHelper.MoveToDesktop(hWnd, right) //<- the one in the russian blog
|| this.helper.MoveWindowToDesktop(hWnd, right.Id)) <- the second implementation
La segunda implementación se puede encontrar aquí: https://github.com/tmyt/VDMHelper Esta puede mover una ventana de otro proceso a otro escritorio. PERO está buggy en este momento. Por ejemplo, cuando intento mover alguna ventana como google chrome, se bloquea.
Entonces este es el resultado de mi investigación. Ahora estoy tratando de hacer una función StickyWindow con estas API.
Me temo que todo sobre "escritorios virtuales" en Windows 10 no está documentado, pero en una página rusa he visto documentado las interfaces. No hablo ruso pero parece que han utilizado ingeniería inversa. De todos modos, el código es muy claro (¡Gracias a ellos!).
Esté atento aquí: http://www.cyberforum.ru/blogs/105416/blog3671.html
He estado tratando de ver si CreateDesktop, OpenDesktop, etc, de la antigua API está vinculada a los nuevos escritorios virtuales, pero de ninguna manera ...
Las interfaces funcionan con la versión de producción final de Windows 10 (2015-05-08), pero no debe usarlas en una aplicación distribuida de manera real hasta que Microsoft las documente. Demasiado riesgo.
Saludos.