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

问题描述:

我想弄清楚如何发送正在运行的应用程序执行使用CreateDesktop创建的新Windows桌面。在Windows中的桌面之间移动应用程序

我可以创建一个新的桌面,然后启动一个应用程序,错误我找不到用正在运行的应用程序的方式。与桌面管理相关的所有功能(例如SetThreadDesktop)始终只适用于当前线程

任何提示?


谢谢你的回答。

唉,其实,我需要做的是移动的不是我(即NOTEPAD.EXE)开发的应用程序

如果看看从PowerToys的虚拟桌面管理器(http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx),它会在几个虚拟桌面相同的WindowStation。 我知道有类似的应用程序可以将运行的应用程序(notepad.exe,calc.exe ..)从一个虚拟桌面移动到另一个虚拟桌面,而无需关闭并再次打开它(然后传递新的桌面句柄[HDESK ]对CreateProcess的调用),但即使阅读了所有相关的msdn文档之后,我仍然无法确定如何执行此操作:

我想上SetProcessWindowStation过,但据我现在,随着CreateDesktop功能创建的所有新的虚拟桌面在同WindowStation,所以......

也许我错过了什么?

我还没有实现任何代码,但只是想想... 从以下MSDN Link

一个自动的过程引述建立到窗口站和桌面连接时,它首先调用USER32或GDI32功能。 如果过程没有调用SetProcessWindowStation,它连接到从父进程继承窗口站

这意味着“运行的应用程序”已有集“的STARTUPINFO结构的lpDesktop成员”的价值到当前的窗口站。我认为您可能需要更改此值以将应用程序发送到其他桌面。 作为该链接提到SetProcessWindowStation Function,这可以使用

BOOL WINAPI SetProcessWindowStation( __in HWINSTA hWinSta )来完成;

此外,作为SetThreadDesktop Function提到

将指定的桌面调用线程。

所以我想,为了这个工作,你'运行应用程序'将需要调用SetThreadDesktop。 这将是有帮助的,如果你可以张贴在一些代码...

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

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

只需尝试从http://vdm.codeplex.com/的Vista/XP虚拟桌面管理器