我通过使用 Process.Start 方法并传递一个 .rdp 文件来启动一个远程应用程序。除了这个 .rdp 文件会导致打开两个窗口之外,这工作正常。我需要处理这两个窗口,以便可以将它们设置为 TopMost 窗口。我需要它们都留在主机应用程序前面。
我相信我应该使用 FindWindowByCaption(IntPtr.Zero, "targetProcess.exe") 但是当我在 Process.Start 之后调用它时它会失败,因为窗口尚未打开。如何在调用 FindWindowByCaption 之前等待此窗口打开。这是我到目前为止所拥有的:
if (gcsMenuItem.ItemUrl.EndsWith(".rdp", StringComparison.InvariantCultureIgnoreCase))
{
string fileName = gcsMenuItem.ItemUrl.Split(':')[1];
targetProcess = Process.Start(GetProjectDataPath() + fileName);
targetProcess.WaitForInputIdle();
while (true)
{
IntPtr hWnd = FindWindowByCaption(IntPtr.Zero, "targetProcess.exe");
if (hWnd != IntPtr.Zero)
{
break;
}
}
targethWnd = targetProcess.MainWindowHandle;
}
我的 while 循环不好,因为它会阻塞 UI。当 .rdp 启动时,用户首先获得一个登录窗口,然后在登录后打开两个窗口。这些是我需要设置为 TopMost 的。
要设置 TopMost,我相信我需要使用类似的东西: SetWindowPos(hostWpfWindowHandle, HWND_TOPMOST, x, y, width, height, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOREDRAW);