【问题标题】:How to Show a wpf window from another process如何从另一个进程显示 wpf 窗口
【发布时间】:2019-05-29 03:35:49
【问题描述】:

我创建了 3 个不同的应用程序

应用 1: 这是一个 WPF 应用程序,它有 1 个显示“Hello Word”的窗口(MainWindow)。

应用 2: 这是一个 WPF 应用程序 此应用程序将创建应用程序 1 的 MainWindow 实例。 如下所示

MainWindow window = new MainWindow();
//And it will store it's window handle to some file
string filePath = @"c:\windowHandle.txt";
var windowInteropHelper = new WindowInteropHelper(window);
File.WriteAllText(filePath, windowInteropHelper.EnsureHandle().ToString());

应用 3: 这又是一个有 2 个按钮的 WPF 应用程序 “显示应用程序 1”和“隐藏应用程序 1”

private void show_Click(object sender, RoutedEventArgs e)
{
    ShowWindow(GetWindowHandle(), 5);            
}        

private void hide_Click(object sender, RoutedEventArgs e)
{
    ShowWindow(GetWindowHandle(), 0);
}

private int GetWindowHandle()
{
    string handle = File.ReadAllText(@"C:\windowHandle.txt");
    return Convert.ToInt32(handle);
}

[DllImport("user32.dll")]
private static extern int ShowWindow(int hwnd, int nCmdShow);

现在我将启动应用程序 2 和应用程序 3。 一旦我单击应用程序 3 中的“显示应用程序 1”按钮, 窗口(应用程序 1)带有黑色背景。它没有显示“Hello world”。 它显示窗口标题,但窗口的其余部分是黑色的。

如果有人知道如何解决它?请告诉我。

如果您对我的查询有任何疑问,请告诉我:)。

【问题讨论】:

  • 只是一个快速的猜测......你还没有初始化窗口上的控件..如果我是对的,请尝试显示窗口并再次从应用程序 2 中隐藏它,这应该可以解决问题
  • 好的,开始工作了......有点......只有当你在 app2 中显示窗口并从 app3 中隐藏它时它才有效......之后,来自 app3 的显示工作......如果你从 app2 中隐藏 id 没有......似乎 wpf 中的 hide() 不仅仅是一个简单的隐藏
  • 所以解决方法是:来自 app2 的 Show() >来自 app2 的 ShowWindow(wnd, 0) >来自 app3 的 ShowWindow(wnd, 5)
  • 感谢@FastJack3。我还观察到这一点,如果我们在 app2 中调用 show 那么它将起作用。我在想这是唯一的方法。如果不显示在 app2 中,我们不能这样做吗?
  • 因为 WPF 似乎在其自己的 Show() 函数中做了很多初始化工作,所以不。因为如果您只是进行简单的 WinAPI Show 调用,则不会执行此代码

标签: c# wpf interopservices


【解决方案1】:

确认工作

应用程序2:

MainWindow window = new MainWindow();
window.Show();
//And it will store it's window handle to some file
string filePath = @"c:\windowHandle.txt";
var windowInteropHelper = new WindowInteropHelper(window);
File.WriteAllText(filePath, windowInteropHelper.EnsureHandle().ToString());
ShowWindow(windowInteropHelper.Handle.ToInt32(), 0);

App3 原样

编辑:

来自.net 参考来源:

// RootVisual is not set until Show.
// Only set RootVisual when we are going to show the window.
if (!HwndCreatedButNotShown)
{
    SetRootVisualAndUpdateSTC();
}

评论说明了一切.. ;) 如果你只使用winapi,没有设置RootVisual...

【讨论】:

  • 是的,它有效。但这看起来像是一种解决方法。这是唯一的方法吗?
  • 如果你想用 ShowWindow 显示窗口,是的。似乎 WPF 不仅仅是在 Hide() 上进行简单的隐藏。这看起来像一些控件被破坏,或者至少是这些控件的渲染器。我想到的唯一其他方法是开发某种与 app2 通信并让 app2 显示窗口的 API。
  • 您能否添加您添加的 .net 参考的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多