在虚拟桌面之间移动运行的应用

时间:2013-12-03 15:28:17

标签: c#

我已经阅读了与虚拟桌面相关的堆栈溢出文章,下面是与虚拟桌面相关的链接,但它无法解决我的问题。

“如何在默认桌面和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显示真实值,但我的应用程序仍保留在旧桌面中,并且不会移动到新桌面。可能是因为我的应用程序没有从一个桌面移动到另一个桌面。我错过了什么。请帮忙......

谢谢&问候, 阿苏

1 个答案:

答案 0 :(得分:4)

根据您的描述,我假设您的应用程序已经在创建它的“原始”桌面上至少有一个窗口。 MSDN告诉我们:

  

如果调用线程有任何设置,则SetThreadDesktop函数将失败   当前桌面上的窗口或挂钩(除非是hDesktop参数   是当前桌面的句柄。)

但你写道,SetThreadDesktop成功了。对此的唯一解释是,您应用SetThreadDesktop的线程没有任何钩子或窗口,因此它不是具有您已经显示的UI的线程。

不幸的是无法在Windows上将Windows从一个桌面移动到另一个桌面。您可以做的最大值是在特定桌面上创建窗口。

您可能认为虚拟桌面管理器应用程序有一个解决方法。事实是,Windows上的大多数应用程序仅模仿多桌面行为,但它们只是在Winsta0\default桌面上显示/隐藏相应的窗口,任务栏,背景等。 其中一个例外是SysInternals的桌面应用程序。但是猜猜看,他们遇到了同样的问题:

  

桌面依赖Windows桌面对象意味着它不能   提供其他虚拟桌面实用程序的一些功能,   然而。例如,Windows不提供移动窗口的方法   从一个桌面对象到另一个桌面对象