我已经阅读了与虚拟桌面相关的堆栈溢出文章,下面是与虚拟桌面相关的链接,但它无法解决我的问题。
“如何在默认桌面和Winlogon桌面之间切换进程?” How to switch a process between default desktop and Winlogon desktop?
“在Windows中的桌面之间移动应用程序” Moving applications between desktops in Windows
我在一个桌面上运行WPF应用程序,当我切换到该桌面时,我想将该应用程序移动到另一个桌面。我已经应用了下面提到的文章中提到的代码。
{代码}
Debug.Write("MoveTONewDesktop ........");
IntPtr hWinSta0 = OpenWindowStation("WinSta0", false, ACCESS_MASK.MAXIMUM_ALLOWED);
Debug.Write("Windows Station Pointer "+ hWinSta0.ToInt32());
if (null == hWinSta0) { }
hWinSta0 = SetProcessWindowStation(hWinSta0);
Debug.Write("SetProcessWindowStation " + hWinSta0.ToInt32());
IntPtr hDesk = OpenDesktop("ABCD", 0, false, ACCESS_MASK.MAXIMUM_ALLOWED);
Debug.Write("OpenDesktop " + hDesk.ToInt32());
if (null == hDesk) { }
bool result = SwitchDesktop(hDesk);
Debug.Write("SwitchDesktop " + result);
bool bSuccess = SetThreadDesktop(hDesk);
Debug.Write("SetThreadDesktop " + bSuccess);
if (!bSuccess)
{
Debug.Write("Get Last WIn32 Error " + Marshal.GetLastWin32Error());
System.Console.WriteLine(Marshal.GetLastWin32Error());
}
if (hDesk != null) { CloseDesktop(hDesk); }
if (hWinSta0 != null) { CloseWindowStation(hWinSta0); }
在调试时,我看到正确的句柄被打印,我的桌面被切换。此外,setThreadDesktop显示真实值,但我的应用程序仍保留在旧桌面中,并且不会移动到新桌面。可能是因为我的应用程序没有从一个桌面移动到另一个桌面。我错过了什么。请帮忙......
谢谢&问候, 阿苏
答案 0 :(得分:4)
根据您的描述,我假设您的应用程序已经在创建它的“原始”桌面上至少有一个窗口。 MSDN告诉我们:
如果调用线程有任何设置,则SetThreadDesktop函数将失败 当前桌面上的窗口或挂钩(除非是hDesktop参数 是当前桌面的句柄。)
但你写道,SetThreadDesktop成功了。对此的唯一解释是,您应用SetThreadDesktop
的线程没有任何钩子或窗口,因此它不是具有您已经显示的UI的线程。
不幸的是无法在Windows上将Windows从一个桌面移动到另一个桌面。您可以做的最大值是在特定桌面上创建窗口。
您可能认为虚拟桌面管理器应用程序有一个解决方法。事实是,Windows上的大多数应用程序仅模仿多桌面行为,但它们只是在Winsta0\default
桌面上显示/隐藏相应的窗口,任务栏,背景等。
其中一个例外是SysInternals的桌面应用程序。但是猜猜看,他们遇到了同样的问题:
桌面依赖Windows桌面对象意味着它不能 提供其他虚拟桌面实用程序的一些功能, 然而。例如,Windows不提供移动窗口的方法 从一个桌面对象到另一个桌面对象