2015-08-04 3 views
28

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

+3

http://stackoverflow.com/a/32417530/17034 –

Répondre

21

Le Windows SDK Support Team Blog a affiché un C# demo to switch Desktops 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 inclut l'API pour détecter sur laquelle le bureau de la fenêtre est affichée et il peut changer et déplacer Windows l'un bureau.

+1

Kinda vous fait vous demander pourquoi Microsoft n'a pas simplement ajouté un raccourci clavier pour cela directement doesn ' t it ... – Adam

7

Je crains que tout sur "Virtual desktoptops" dans Windows 10 est non documenté, mais dans une page russe, j'ai vu documenté les interfaces. Je ne parle pas le russe mais semble avoir utilisé l'ingénierie inverse. Quoi qu'il en soit, le code est très clair (merci à eux!).

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

J'ai essayé de voir si l'ancien CreateDesktop de l'API, OpenDesktop, etc ... est lié au nouveau Virtual-PC de bureau, mais pas moyen ...

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 réellement distribuée tant que Microsoft ne les a pas documentées. Trop de risque.

Cordialement.

+4

[Il est documenté] (https://msdn.microsoft.com/fr-fr/library/windows/desktop/mt186440%28v=vs.85 % 29.aspx). –

+0

Oui, il existe une documentation pour une interface. Mais comment l'utilisez-vous dans une application UWP "normale" en utilisant C#/xaml ?? Pouvez-vous donner des exemples de cela? – okieh

+0

@okieh regarde ma réponse. Microsoft a créé une démo C# – magicandre1981

9

Il ya 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 traduction est en japonais)

En fait, il a utilisé le même api mantionned dans la réponse d'Alberto Tostado. http://www.cyberforum.ru/blogs/105416/blog3671.html et l'api se trouve sur son github https://github.com/Grabacr07/VirtualDesktop

Le 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 résoudre ce problème, ils ont fait une autre mise en œuvre qu'ils utilisent aux côtés de celui dans le blog russe

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

se trouve la deuxième mise en œuvre ici: https://github.com/tmyt/VDMHelper Celui-ci peut se déplacer une fenêtre d'un autre traiter vers un autre bureau. MAIS c'est buggé en ce moment. Par exemple quand j'essaie de déplacer une fenêtre comme google chrome il plantage.

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

+0

Je voudrais faire quelque chose d'encore plus simple que de déplacer des fenêtres, juste pour changer de bureau. Comment je ferais ça? Je suis très frustré par le manque de retour à la clé de bureau précédente, ce serait la chose la plus utile de tous les temps - et par le manque de clés de bureau directes - par ex. comme win-ctrl-1 pour aller au bureau 1 - donc je voudrais écrire un script autoit pour faire ces clés – ycomp

+0

Oui, c'est vraiment simple à mettre en œuvre! Il y a ce projet: https://github.com/nullpo-head/Windows-10-Virtual-Desktop-Switching-Shortcut cela fait exacly que Mais je vous suggère de personnaliser le code de ce projet (https : //github.com/Grabacr07/SylphyHorn) à vos besoins. Il a une meilleure mise en œuvre. – CodeName

+0

@ycomp J'ai fait une DLL qui est accessible depuis AutoHotkey https://github.com/Ciantic/VirtualDesktopAccessor – Ciantic