问题
I've been trying to use IVirtualDesktopManager::MoveWindowToDesktop to move windows between virtual desktops.
Using it on my own windows works great but unfortunately it fails with E_ACCESSDENIED when I try to use it on the window of another process.
Sadly "Launch as admin" is not good enough for it. Am I missing something that I don't know about COM interfaces or is it just badly designed ?
回答1:
You can move a window not owned by the executing process, but it requires the use of additional, undocumented COM objects.
- Query ImmersiveShell for instances of IApplicationViewCollection and IVirtualDesktopManagerInternal.
- Get the hwnd of the window you want to move.
- It sounds like you already know the target desktop ID, but you can also use IVirtualDesktopManagerInternal methods GetAdjacentDesktop and GetDesktops to find more.
- Call IApplicationViewCollection::GetViewForHwnd to get the view.
- Call IVirtualDesktopManagerInternal::MoveViewToDesktop to move the view.
Code references:
- VirtualDesktopAccessor wraps the relevant objects in C++ and builds a native DLL you can use.
- VirtualDesktop wraps them in C# and provides a .NET DLL and GUI.
- zVirtualDesktop documents different versions of the interfaces.
- This forum topic shows how to work with the IVirtualDesktopManagerInternal to select a virtual desktop by index in AutoHotKey. I'm working on a version that also wraps IApplicationViewCollection to support moving any given window as described above.
来源:https://stackoverflow.com/questions/32659505/windows-10-ivirtualdesktopmanagermovewindowtodesktop