1

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

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

有什么提示吗?


谢谢您的回答。

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

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

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

也许我错过了什么?

4

3 回答 3

1

Window resources (such as HWNDs) are specific to a desktop. If you create a window in one desktop, I can't see how you would be able to move it to another desktop. For example, the HWNDs used by your application might already be in use in the other desktop.

Virtual Desktop Managers don't have to use Windows Desktops -- they can create the same effect by manipulating the windows. Take a look at VirtuaWin, an open source Virtual Desktop Manager.

于 2009-06-15T21:12:25.627 回答
0

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

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

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

BOOL WINAPI SetProcessWindowStation( __in HWINSTA hWinSta );

此外,正如SetThreadDesktop 函数所提到的

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

所以我想,为了让它工作,你“运行应用程序”需要调用 SetThreadDesktop。如果您可以发布一些代码将会很有帮助...

于 2009-01-23T12:06:20.977 回答
0

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

于 2010-05-07T11:30:37.457 回答