在Windows中的桌面之间移动应用程序

时间:2009-01-23 07:14:47

标签: windows language-agnostic winapi desktop

我试图找出如何发送正在运行的应用程序执行使用CreateDesktop创建的新Windows桌面。

我可以创建一个新的桌面,然后在其中启动一个应用程序,我找不到运行应用程序的方法。与桌面管理相关的所有功能(即,SetThreadDesktop)始终仅适用于当前线程

任何提示?


感谢您的回答。

嗯,事实上,我需要做的是移动不是由我开发的应用程序(即notepad.exe)

如果从Powertoys(http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx)查看Virtual Desktop Manager,它会在同一个WindowStation中创建多个虚拟桌面。 我知道有类似的应用程序可以将运行的应用程序(notepad.exe,calc.exe ..)从一个虚拟桌面移动到另一个虚拟桌面,而无需关闭它并再次重新打开它(然后传递新的桌面句柄[HDESK]在调用CreateProcess时),但即使在阅读了所有相关的msdn文档之后,我仍然无法想象如何做到这一点:|

我也想过SetProcessWindowStation,但就我而言,使用CreateDesktop功能创建的所有新虚拟桌面都在同一个WindowStation上,所以......

也许我错过了什么?

3 个答案:

答案 0 :(得分:1)

窗口资源(例如HWND)特定于桌面。如果您在一个桌面上创建一个窗口,我无法看到您如何将其移动到另一个桌面。例如,您的应用程序使用的HWND可能已在另一个桌面中使用。

虚拟桌面管理员不必使用Windows桌面 - 他们可以通过操作窗口来创建相同的效果。看看VirtuaWin,一个开源的Virtual Desktop Manager。

答案 1 :(得分:0)

我没有实现任何代码,只是大声思考...... 引用以下MSDN Link

  

进程首次调用USER32或GDI32函数时,进程会自动建立与窗口站和桌面的连接。   如果进程没有调用SetProcessWindowStation,它将连接到从父进程继承的窗口站

这意味着“正在运行的应用程序”已经设置为当前窗口站的“STARTUPINFO结构的lpDesktop成员”的值。我认为您可能需要更改此值以将应用程序发送到另一个桌面。 由于此链接提及SetProcessWindowStation Function,可以使用

完成此操作
  

BOOL WINAPI SetProcessWindowStation(     __in HWINSTA hWinSta   );

此外,正如SetThreadDesktop Function提及

  

将指定的桌面分配给调用线程。

所以我想,为了实现这个目的,你'运行应用'需要调用SetThreadDesktop。 如果您可以发布一些代码,将会很有帮助......

答案 2 :(得分:0)

只需从http://vdm.codeplex.com/

尝试Vista / XP虚拟桌面管理器