web-dev-qa-db-fra.com

API pour les bureaux virtuels Windows 10

Existe-t-il un moyen d'énumérer, de basculer, d'ajouter des bureaux virtuels et de déplacer la fenêtre entre les bureaux à partir du code? De préférence, WinAPI.

36
Alex Butenko

Le Blog de l'équipe de support du SDK Windows a publié une démo C # pour changer de burea via 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);
        }
    }
}

il comprend l'API pour détecter sur quel bureau la fenêtre est affichée et il peut basculer et déplacer un Windows sur un bureau.

29
magicandre1981

Il y a ce gars qui a fait une application pour mapper le raccourci clavier pour déplacer une fenêtre entre le bureau virtuel. https://github.com/Grabacr07/SylphyHorn (je l'utilise tous les jours)

Il a un blog où il explique ce qu'il a fait http://grabacr.net/archives/5701 (vous pouvez utiliser google translate c'est en japonais)

Il a en fait utilisé le même api repris dans la réponse d'Alberto Tostado. http://www.cyberforum.ru/blogs/105416/blog3671.html et l'api peut être trouvé sur son github https://github.com/Grabacr07/VirtualDesktop =

L'API est vraiment simple à utiliser MAIS il semble impossible de déplacer une fenêtre d'un autre processus.

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;
    }

Pour contourner ce problème, ils ont fait une autre implémentation qu'ils utilisent à côté de celle du blog russe

if (VirtualDesktopHelper.MoveToDesktop(hWnd, right) //<- the one in the russian blog
                    || this.helper.MoveWindowToDesktop(hWnd, right.Id)) <- the second implementation

La deuxième implémentation peut être trouvée ici: https://github.com/tmyt/VDMHelper Celui-ci peut déplacer une fenêtre d'un autre processus vers un autre bureau. MAIS c'est buggé en ce moment. Par exemple, lorsque j'essaye de déplacer une fenêtre comme google chrome ça plante.

C'est donc le résultat de mes recherches. Je suis maintenant en train d'essayer de créer une fonctionnalité StickyWindow avec ces API.

13
CodeName

Je crains que tout ce qui concerne les "bureaux virtuels" dans Windows 10 ne soit pas documenté, mais dans une page russe, j'ai vu documenté les interfaces. Je ne parle pas russe mais semble avoir utilisé une ingénierie inversée. Quoi qu'il en soit, le code est très clair (merci à eux!).

Gardez un œil ici: http://www.cyberforum.ru/blogs/105416/blog3671.html

J'ai essayé de voir si les anciennes API CreateDesktop, OpenDesktop, etc ... étaient liées aux nouveaux Virtual-Desktops, mais pas du tout ...

Les interfaces fonctionnent avec la version de production finale de Windows 10 (2015-05-08), mais vous ne devez pas les utiliser dans une application distribuée à grande échelle tant que Microsoft ne les a pas documentées. Trop de risques.

Cordialement.

7
Alberto Tostado