C'è un modo per enumerare, cambiare, aggiungere desktop virtuali e spostare la finestra tra i desktop dal codice? Preferibilmente, WinAPI.API per desktop virtuali Windows 10
risposta
Il Windows SDK Support Team Blog inviato 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);
}
}
}
esso include l'API per rilevare su quale desktop viene mostrata la finestra e si può cambiare e spostare un Windows l'un desktop.
Kinda ti chiede perché Microsoft non ha aggiunto solo una scorciatoia da tastiera per questo direttamente doesn ' t it ... – Adam
Temo che tutto ciò che riguarda "Desktop virtuali" in Windows 10 non sia documentato, ma in una pagina russa ho visto le interfacce documentate. Non parlo russo ma sembra che abbiano usato l'ingegneria invertita. Ad ogni modo, il codice è molto chiaro (grazie a loro!).
Tenete d'occhio qui: http://www.cyberforum.ru/blogs/105416/blog3671.html
Ho cercato di vedere se CreateDesktop della vecchia API, OpenDesktop, ecc ... è legata alla nuova Virtual-Desktop, ma nessun modo ...
Le interfacce funzionano con la versione di produzione finale di Windows 10 (2015-05-08), ma non è necessario utilizzarle in un'applicazione distribuita su vasta scala finché Microsoft non le documenta. Troppo rischio.
Saluti.
[È documentato] (https://msdn.microsoft.com/en-us/library/windows/desktop/mt186440%28v=vs.85 % 29.aspx). –
Sì, c'è qualche documentazione per un'interfaccia. Ma come lo usi in una "normale" app UWP usando C#/xaml ?? Puoi dare qualche esempio? – okieh
@okieh guarda la mia risposta. Microsoft ha creato una demo C# – magicandre1981
C'è questo tizio che ha creato un'applicazione per mappare la tastiera shorcut per spostare una finestra tra il desktop virtuale. https://github.com/Grabacr07/SylphyHorn (lo uso tutti i giorni)
Lui ha un blog in cui spiega quello che ha fatto http://grabacr.net/archives/5701 (è possibile utilizzare Google Translate è in giapponese)
Ha infatti utilizzato la stessa API mantionned in la risposta di Alberto Tostado. http://www.cyberforum.ru/blogs/105416/blog3671.html e l'API può essere trovato sul suo github https://github.com/Grabacr07/VirtualDesktop
l'API è molto semplice da usare, ma sembra impossibile spostare una finestra da un altro processo.
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;
}
Per risolvere questo problema hanno fatto un'altra implementazione che usano accanto a quello nel blog russo
if (VirtualDesktopHelper.MoveToDesktop(hWnd, right) //<- the one in the russian blog
|| this.helper.MoveWindowToDesktop(hWnd, right.Id)) <- the second implementation
La seconda implementazione può essere trovato qui: https://github.com/tmyt/VDMHelper Questo si può spostare una finestra da un altro elaborare su un altro desktop. MA è bacato in questo momento. Ad esempio quando provo a spostare alcune finestre come google chrome si blocca.
Quindi questo è il risultato della mia ricerca. Ora sto cercando di creare una funzione StickyWindow con queste API.
Mi piacerebbe fare qualcosa di ancora più semplice dello spostamento di windows, solo per cambiare desktop. Come potrei farlo? Sono molto frustrato dalla mancanza di un ritorno alla chiave del desktop precedente, che sarebbe la cosa più utile di sempre - e dalla mancanza di tasti diretti del desktop - ad es. come win-ctrl-1 per andare al desktop 1 - quindi mi piacerebbe scrivere uno script autoit per rendere quelle chiavi – ycomp
Sì questo è molto semplice da implementare! C'è questo progetto: https://github.com/nullpo-head/Windows-10-Virtual-Desktop-Switching-Shortcut che fa esattamente quello Ma io suggerirei di personalizzare solo il codice da questo progetto (https : //github.com/Grabacr07/SylphyHorn) per le tue esigenze. Ha un'implementazione migliore. – CodeName
@ycomp Ho creato una DLL accessibile da AutoHotkey https://github.com/Ciantic/VirtualDesktopAccessor – Ciantic
- 1. Desktop virtuale di Windows 10 dalla riga di comando
- 2. Windows 10 Notifiche Toast Applicazione desktop
- 3. Login Facebook - UWP Windows 10 - Desktop
- 4. Windows 10 UWP targeting solo per Windows 10 mobile
- 5. Duplicazione del desktop in modo programmatico su Windows 10
- 6. Rilevamento del desktop virtuale attivo su Windows 10 - Visualizzazione attività - commutatore desktop virtuale
- 7. ridimensionamento improprio dell'applicazione Qt Desktop in Windows 10
- 8. Piastrelle di colore nelle app desktop di Windows 10
- 9. Registro .NET 4.5 IIS 10 Windows 10
- 10. Istanze multiple di un'app per Windows universale (Windows 10)
- 11. App UWP per Windows 10 - Impostazione delle dimensioni della finestra sul desktop
- 12. Express per Windows 8 vs Express per Windows Desktop
- 13. Schermata iniziale per applicazioni universali per Windows 10
- 14. Le API Cortana sono disponibili per le applicazioni desktop?
- 15. Come far funzionare Coldfusion 10 con IIS 10 in Windows 10
- 16. Windows 10 Riconoscimento vocale
- 17. Driver PCIe per Windows CE e Windows Desktop
- 18. Realm su Windows 10
- 19. Windows 10 e XAMPP
- 20. Windows UWP trasparente 10
- 21. "os.name" di Java per Windows 10?
- 22. Esegui applicazioni universali per Windows 10 su Windows 8.1
- 23. client desktop OLAP non Windows?
- 24. Hide Windows 8 Desktop Icons
- 25. Impossibile utilizzare l'emulatore di Windows Phone 10
- 26. Chiamata a una libreria di classi universali di Windows 10 da un'applicazione desktop
- 27. Emulatore Windows Phone 8.1 in Windows 10
- 28. API di Windows (.lnk) per collegamenti?
- 29. scorciatoia cygwin ssh dal desktop di Windows
- 30. Desktop App Converter/Invia a Windows Store
http://stackoverflow.com/a/32417530/17034 –