如何从其他进程取消隐藏WPF窗口?

时间:2019-05-14 07:59:24

标签: c# wpf process

我有按“ X”按钮时需要隐藏(不关闭)的WPF程序。

并行地,在某个按钮上有一个c#程序需要取消隐藏它。

隐藏WPF程序效果很好。 问题是,当试图从其他c#进程中取消隐藏它时,WPF窗口显示为黑色(好像窗体本身在显示窗口时仍处于隐藏状态)。

有什么想法吗?

尝试更改ShowWindow()函数上的标志,没有帮助。 试图不隐藏WPF窗口,而是更改可见性,结果相同。

用于隐藏主窗口的WPF代码:

void MainWindow_Closing(object sender, CancelEventArgs e)
{
    e.Cancel = true;
    Hide();

}

c#代码:

var myHandle= UIWin32.FindWindow(null, "My title");
UIWin32.ShowWindow(myHandle, UIWin32.Win32Flags.SW_SHOW);
UIWin32.ShowWindow(myHandle, UIWin32.Win32Flags.SW_RESTORE);
UIWin32.SetForegroundWindow(myHandle);

2 个答案:

答案 0 :(得分:0)

ShowWindow之后,您可以使用带有重绘标志的MoveWindow函数,如下所示:

MoveWindow(handle,0,0,width,height,true);

签名:

[DllImport("User32.dll")]
extern bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);

答案 1 :(得分:0)

通过查看Window.Hide()的参考源,似乎“隐藏”既将窗口的Visibility属性设置为Visibility.Hidden,又用ShowWindow(..., SW_HIDE隐藏了窗口的源窗口。

使用ShowWindow(myHandle, SW_HIDE)确实显示了源窗口,但是Visibility属性仍然是Visibility.Hidden,这就是为什么什么都没画出来的原因。 Window类中的所有内容似乎都无法检查窗口是否在外部重新显示。

但是Window类将对WM_ACTIVATE生成的SetForegroundWindow()消息作出反应;发生这种情况时,它将调用OnActivated()方法。因此,以下代码将在激活后在WPF窗口上重置Visibility

protected override void OnActivated(EventArgs e)
{
    base.OnActivated(e);
    Show();
}