Перемещение приложений между рабочими столами в Windows

Я пытаюсь понять, как отправить работающее приложение на новый рабочий стол Windows, созданный с помощью CreateDesktop.

Я могу создать новый рабочий стол, а затем запустить на нем приложение, ошибка, я не могу найти способ сделать это с работающим приложением. Все функции, связанные с управлением рабочим столом (например, SetThreadDesktop), всегда применяются только к текущему потоку.

Какие-нибудь намеки?


Спасибо за ваш ответ.

Что ж, на самом деле мне нужно переместить приложения, разработанные не мной (например, notepad.exe)

Если посмотреть на Virtual Desktop Manager из Powertoys (http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx), он создает несколько виртуальных рабочих столов в одном WindowStation. Я знаю, что есть похожие приложения, которые могут перемещать запущенные приложения (notepad.exe, calc.exe ..) с одного виртуального рабочего стола на другой без необходимости его закрытия и повторного открытия (а затем передачи нового дескриптора рабочего стола [HDESK] при вызове CreateProcess), но даже после прочтения всей связанной документации msdn я все еще не могу понять, как это сделать: |

Я тоже думал о SetProcessWindowStation, но сейчас все новые виртуальные рабочие столы, созданные с помощью функции CreateDesktop, находятся на одном WindowStation, так что ...

Может я что то упустил?


person user58196    schedule 23.01.2009    source источник


Ответы (3)


Ресурсы окна (например, HWND) относятся к рабочему столу. Если вы создадите окно на одном рабочем столе, я не понимаю, как вы сможете переместить его на другой рабочий стол. Например, HWND, используемые вашим приложением, могут уже использоваться на другом рабочем столе.

Менеджерам виртуальных рабочих столов необязательно использовать рабочие столы Windows - они могут создавать тот же эффект, манипулируя окнами. Взгляните на VirtuaWin, диспетчер виртуальных рабочих столов с открытым исходным кодом.

person jdigital    schedule 15.06.2009

Я не реализовал никакого кода, но просто размышляю вслух ... Цитата из следующего Ссылка MSDN

Процесс автоматически устанавливает соединение с оконной станцией и рабочим столом, когда он впервые вызывает функцию USER32 или GDI32. Если процесс не вызвал SetProcessWindowStation, он подключается к оконной станции, унаследованной от родительского процесса.

Это означает, что «запущенное приложение» уже имеет значение «член lpDesktop структуры STARTUPINFO», установленное на текущую оконную станцию. Я думаю, вам может потребоваться изменить это значение, чтобы отправить приложение на другой рабочий стол. Поскольку в этой ссылке упоминается SetProcessWindowStation Function, это может быть сделано с использованием

BOOL WINAPI SetProcessWindowStation (__in HWINSTA hWinSta);

Кроме того, как упоминается в Функция SetThreadDesktop

Назначает указанный рабочий стол вызывающему потоку.

Итак, я думаю, чтобы это сработало, «запущенное приложение» должно вызвать SetThreadDesktop. Было бы полезно, если бы вы могли опубликовать какой-нибудь код ...

person Codex    schedule 23.01.2009

Просто попробуйте Vista / XP Virtual Desktop Manager со страницы http://vdm.codeplex.com/

person Suriyan Suresh    schedule 07.05.2010