Windows 10 IVirtualDesktopManager::MoveWindowToDesktop
Я пытался использовать IVirtualDesktopManager::MoveWindowToDesktop для перемещения окон между виртуальными рабочими столами.
Использование его в моих собственных окнах прекрасно работает, но, к сожалению, он не работает с E_ACCESSDENIED, когда я пытаюсь использовать его в окне другого процесса.
К сожалению, "Запуск от имени администратора" недостаточно хорош для этого. Я что-то упускаю из-за COM-интерфейсов или просто плохо спроектирован?
0 ответов
Вы можете переместить окно, не принадлежащее выполняющемуся процессу, но оно требует использования дополнительных недокументированных COM-объектов.
- Запросите ImmersiveShell для экземпляров IApplicationViewCollection и IVirtualDesktopManagerInternal.
- Получите hwnd окна, которое вы хотите переместить.
- Похоже, вы уже знаете идентификатор целевого рабочего стола, но вы также можете использовать методы IVirtualDesktopManagerInternal GetAdjacentDesktop и GetDesktops, чтобы узнать больше.
- Вызовите IApplicationViewCollection::GetViewForHwnd, чтобы получить представление.
- Вызовите IVirtualDesktopManagerInternal::MoveViewToDesktop, чтобы переместить представление.
Ссылки на код:
- VirtualDesktopAccessor оборачивает соответствующие объекты в C++ и создает собственную DLL, которую вы можете использовать.
- VirtualDesktop оборачивает их в C# и предоставляет.NET DLL и GUI.
- zVirtualDesktop документирует различные версии интерфейсов.
- В этом разделе форума показано, как работать с IVirtualDesktopManagerInternal для выбора виртуального рабочего стола по индексу в AutoHotKey. Я работаю над версией, которая также оборачивает IApplicationViewCollection для поддержки перемещения любого данного окна, как описано выше.