记录一下WPF 调用 窗口自带的Hide() 方法,用 Win32 的ShowWindow 显示窗口异常的问题

最近有小伙伴的应用里边,需要跨进程的方式,显示隐藏窗口。

在WPF 自身的应用中,使用的最多的就是 窗口自带的 Hide()Show() 方法

1、创建一个HideWindow的窗口,添加按钮,在点击按钮的时候,调用Hide()方法。

image

 

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }


    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
         this.Hide();
    }
}

 

2、创建一个激活的窗口,添加按钮,在点击按钮的时候,将HideWindow的窗口激活并显示

image

 

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }


    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

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

    [DllImport("user32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);


    [DllImport("user32.dll")]
    private static extern bool SetActiveWindow(IntPtr hWnd);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool IsWindowVisible(IntPtr hWnd);
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
        int X, int Y, int cx, int cy, uint uFlags);
    // 窗口显示状态常量
    private const int SW_SHOWNOACTIVATE = 4;  // 显示窗口但不激活
    private const int SW_SHOWNA = 8;           // 显示窗口但不激活
    private const int SW_SHOWMINIMIZED = 2;    // 显示最小化窗口
 
    // 窗口定位常量
    private const uint SWP_NOACTIVATE = 0x0010;
    private const uint SWP_NOZORDER = 0x0004;
    private const uint SWP_NOSIZE = 0x0001;
    private const uint SWP_NOMOVE = 0x0002;
    private const uint SWP_SHOWWINDOW = 0x0040;
    // 定义窗口状态常量
    private const int SW_RESTORE = 9; // 激活并显示窗口。如果窗口最小化或最大化,系统将其还原到原始大小和位置。

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        var intptr = FindWindow(null, "HideWindow");

        if (intptr != IntPtr.Zero)
        { 
            var isVisible = IsWindowVisible(intptr);
            var showResult = ShowWindow(intptr, SW_RESTORE);

            //uint flags = SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW;
            //SetWindowPos(intptr, IntPtr.Zero, 0, 0, 0, 0, flags);

            isVisible = IsWindowVisible(intptr);
            var setResult = SetForegroundWindow(intptr);
        }

    }
}

结果如下:

在设置ShowWindow的方法,返回的是False,并且HideWindow的窗口是黑屏的

image

 

image

 

 解决方法:

1、修改HideWindow 窗口的隐藏方式:

通过调用Win32的  ShowWindow(handle, SW_Hide); 

 public partial class MainWindow : Window
 {
     public MainWindow()
     {
         InitializeComponent();
     }


     private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
     {
         Win32Hide();
         // this.Hide();
     }

     private void Win32Hide()
     {
         var handle = new WindowInteropHelper(this).Handle;

         ShowWindow(handle, SW_Hide);
     }

     private int SW_Hide = 0;

     [DllImport("user32.dll")]
     private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
 }

2、ActiveWindow 的窗口的方法保持不变

结果如下:

ActiveWindow 的 窗口var showResult = ShowWindow(intptr, SW_RESTORE); 返回之为True,并且窗口可以激活并显示

image

image

 

代码Demo 链接 :wutangyuan/wutyDemo: Demo代码备份

posted @ 2025-08-09 22:37  wuty007  阅读(88)  评论(0)    收藏  举报