【问题标题】:How to unhide WPF window from another process?如何从另一个进程中取消隐藏 WPF 窗口?
【发布时间】:2019-05-14 07:59:23
【问题描述】:

按下“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);

【问题讨论】:

    标签: c# wpf process


    【解决方案1】:

    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);
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多