Windows 10 IVirtualDesktopManager::MoveWindowToDesktop

亡梦爱人 提交于 2020-01-01 10:13:02

问题


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.

  1. Query ImmersiveShell for instances of IApplicationViewCollection and IVirtualDesktopManagerInternal.
  2. Get the hwnd of the window you want to move.
  3. It sounds like you already know the target desktop ID, but you can also use IVirtualDesktopManagerInternal methods GetAdjacentDesktop and GetDesktops to find more.
  4. Call IApplicationViewCollection::GetViewForHwnd to get the view.
  5. 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!