none
通过Hide方法隐藏的窗体,在另外一个进程中如何将他显示出来? RRS feed

  • 问题

  • 程序A:WPF开发,运行之后用户可以点击“隐藏”按钮将窗体隐藏(通过this.Hide()方法)

    程序B:WPF开发,通过FindWindow API函数找到正在运行的程序A,再用SetForegroundWindow API将程序A显示到前台

    可是,如果程序A已经处于“隐藏”状态,此时SetForegroundWindow就无效,程序A的窗体仍然处于不可见状态,即使再加上ShowWindow也没有用

    程序B的代码:

                do
                {
                    hNext = FindWindowEx(IntPtr.Zero, hNext, IntPtr.Zero, null);
                    if (!hNext.Equals(IntPtr.Zero))
                    {
                        StringBuilder s = new StringBuilder(512);
                        int i = GetWindowText(hNext, s, s.Capacity);
                        title = s.ToString();
                        if (title.IndexOf("XXXXXX") != -1)
                        {
                            Console.WriteLine(title);
                            SetForegroundWindow(hNext);
                            //ShowWindow(hNext, SW_RESTORE);//没效果
                            ShowWindow(hNext, SW_SHOW);//也没有效果
                            break;
                        }
                    }
                }
                while (!hNext.Equals(IntPtr.Zero));
    

    我能否根据窗体的句柄获得窗体的对象,这样我就可以用Show()方法来显示?



    da jia hao!

    2020年10月28日 7:27

全部回复

  • 可以使用ShowWindowAsync

     [DllImport("User32.dll")]
            private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
            //API 常数定义
            private const int SW_HIDE = 0;
            private const int SW_NORMAL = 1; //正常弹出窗体
            private const int SW_MAXIMIZE = 3; //最大化弹出窗体
            private const int SW_SHOWNOACTIVATE = 4;
            private const int SW_SHOW = 5;
            private const int SW_MINIMIZE = 6;
            private const int SW_RESTORE = 9;
            private const int SW_SHOWDEFAULT = 10;

     也可以搭配IsWindowVisible检测窗口是否隐藏     

        
          



    • 已编辑 ARM830 2020年10月28日 11:57
    2020年10月28日 11:34
  • ShowWindowAsync只是异步版本,和ShowWindow没有本质区别啊。

    我的意思是,程序A的窗体,通过Hide()方法隐藏掉了,此时任务栏上也没有它的图标;

    接着程序B,通过FindWindow找到A的窗体句柄,再用ShowWindow API函数无法将A的窗体显示出来(A的窗体会闪一下,然后立即消失,任务栏上已经显示了它的图标)

    (注意:如果A的窗体没有隐藏,代码就完全没有问题,现在要解决当A的窗体隐藏了之后的情况

    另外你演示的图里面,只是将窗体最小化了,而不是隐藏【this.Hide()】


    da jia hao!


    • 已编辑 liubin 2020年10月29日 9:54
    2020年10月29日 9:52
  • 或者我这样问:

    C#的Hide()方和和API的ShowWindow(hWnd,SW_HIDE)

    等效吗?

    如果等效,那么

    ShowWindow(hWnd,SW_SHOW)就应该和Show()方法等效才对啊?


    da jia hao!

    2020年10月30日 4:12
  • 算了,我放弃治疗了......

    既然Hide/Show方法和ShowWindow函数不等效,我索性统一使用ShowWindow好了

    即两个程序都统一使用ShowWindow函数去显示/隐藏窗体,这样就没有问题了。

    实测程序A隐藏之后,程序B可以通过ShowWindow将A的窗体显示出来。


    da jia hao!

    2020年10月30日 8:24
  • 抱歉现在才回复

    如果WPF窗体隐藏【hide】之后也是是可以使用的,不过可能会造成内部黑色,因为hide方法会将内部控件隐藏。

    所以必须重写OnActivated方法

         protected override void OnActivated(EventArgs e)
            {
                base.OnActivated(e);
                this.Visibility = Visibility.Visible;
                
            }

    同样也可以使用SetWindowPos这个API


    • 已编辑 ARM830 2020年11月8日 11:29
    2020年11月8日 11:29