我试图找出如何发送正在运行的应用程序执行使用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上,所以......
也许我错过了什么?
答案 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)