Перемещение приложений между рабочими столами в Windows - PullRequest
1 голос
/ 23 января 2009

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

Я могу создать новый рабочий стол, а затем запустить на нем приложение, ошибка, я не могу найти способ сделать это с работающим приложением. Все функции, относящиеся к управлению рабочим столом (i.ec, 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, поэтому ...

Может быть, я что-то пропустил?

Ответы [ 3 ]

1 голос
/ 16 июня 2009

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

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

0 голосов
/ 07 мая 2010

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

0 голосов
/ 23 января 2009

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

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

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

BOOL WINAPI SetProcessWindowStation ( __in HWINSTA hWinSta );

Также, как Функция SetThreadDesktop упоминает

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

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

...