Windows 10 IVirtualDesktopManager::MoveWindowToDesktop

Я пытался использовать IVirtualDesktopManager::MoveWindowToDesktop для перемещения окон между виртуальными рабочими столами.

Использование его в моих собственных окнах прекрасно работает, но, к сожалению, он не работает с E_ACCESSDENIED, когда я пытаюсь использовать его в окне другого процесса.

К сожалению, "Запуск от имени администратора" недостаточно хорош для этого. Я что-то упускаю из-за COM-интерфейсов или просто плохо спроектирован?

0 ответов

Вы можете переместить окно, не принадлежащее выполняющемуся процессу, но оно требует использования дополнительных недокументированных COM-объектов.

  1. Запросите ImmersiveShell для экземпляров IApplicationViewCollection и IVirtualDesktopManagerInternal.
  2. Получите hwnd окна, которое вы хотите переместить.
  3. Похоже, вы уже знаете идентификатор целевого рабочего стола, но вы также можете использовать методы IVirtualDesktopManagerInternal GetAdjacentDesktop и GetDesktops, чтобы узнать больше.
  4. Вызовите IApplicationViewCollection::GetViewForHwnd, чтобы получить представление.
  5. Вызовите IVirtualDesktopManagerInternal::MoveViewToDesktop, чтобы переместить представление.

Ссылки на код:

  • VirtualDesktopAccessor оборачивает соответствующие объекты в C++ и создает собственную DLL, которую вы можете использовать.
  • VirtualDesktop оборачивает их в C# и предоставляет.NET DLL и GUI.
  • zVirtualDesktop документирует различные версии интерфейсов.
  • В этом разделе форума показано, как работать с IVirtualDesktopManagerInternal для выбора виртуального рабочего стола по индексу в AutoHotKey. Я работаю над версией, которая также оборачивает IApplicationViewCollection для поддержки перемещения любого данного окна, как описано выше.
Другие вопросы по тегам