我想弄清楚如何发送正在运行的应用程序来执行使用CreateDesktop创build的新Windows桌面。
我可以创build一个新的桌面,然后启动一个应用程序,错误我找不到用正在运行的应用程序的方式。 与桌面pipe理相关的所有function(例如,SetThreadDesktop)总是仅适用于当前线程
任何提示?
谢谢您的回答。
实际上,我需要做的是移动我没有开发的应用程序(即notepad.exe)
如果从Powertoys( http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx )查看Virtual Desktop Manager,它会在同一个WindowStation中创build多个虚拟桌面。 我知道有类似的应用程序可以将运行的应用程序(notepad.exe,calc.exe ..)从一个虚拟桌面移动到另一个虚拟桌面,而无需closures并重新打开它(然后传递新的桌面句柄[HDESK]对CreateProcess的调用),但即使阅读所有相关的MSDN文档,我仍然不知道如何做到这一点:
我也想到了SetProcessWindowStation,但是就我而言,所有使用CreateDesktop函数创build的新虚拟桌面都在同一个WindowStation上,所以…
也许我错过了什么?
窗口资源(如HWND)特定于桌面。 如果你在一个桌面上创建一个窗口,我看不到如何将它移动到另一个桌面。 例如,您的应用程序使用的HWND可能已经在其他桌面中使用。
虚拟桌面管理器不必使用Windows桌面 – 它们可以通过操作窗口来创建相同的效果。 看看VirtuaWin ,一个开源的虚拟桌面管理器。
我没有实现任何代码,只是想大声…从以下MSDN链接引用
一个进程在第一次调用USER32或GDI32函数时自动建立到窗口站和桌面的连接。 如果进程没有调用SetProcessWindowStation,它将连接到从父进程继承的窗口工作站
这意味着“正在运行的应用程序”已经具有设置为当前窗口站的“STARTUPINFO结构的lpDesktop成员”的值。 我想你可能需要改变这个值来将应用程序发送到另一个桌面。 由于这个链接提到SetProcessWindowStation函数 ,这可以使用
BOOL WINAPI SetProcessWindowStation(__in HWINSTA hWinSta);
此外,正如SetThreadDesktop功能提到的
将指定的桌面分配给调用线程。
所以我想,为了这个工作,你运行应用程序将需要调用SetThreadDesktop。 这将是有帮助的,如果你可以张贴在一些代码…
只要从http://vdm.codeplex.com/尝试Vista / XP虚拟桌面管理器