Giải quyết vấn đề khi gọi phương thức Hide() của WPF và sử dụng ShowWindow của Win32 để hiển thị cửa sổ

Gần đây, một số ứng dụng cần hiển thị và ẩn cửa sổ theo cách chéo tiến trình.

Trong ứng dụng WPF, các phương thức phổ biến nhất để ẩn và hiển thị cửa sổ là Hide()Show().

  1. Tạo một cửa sổ HideWindow với nút, khi nhấp vào nút, gọi phương thức Hide().
public partial class HideWindow : Window
{
    public HideWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.Hide();
    }
}
  1. Tạo một cửa sổ kích hoạt, thêm nút, khi nhấp vào nút, kích hoạt và hiển thị cửa sổ HideWindow.
public partial class ActiveWindow : Window
{
    public ActiveWindow()
    {
        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 IsWindowVisible(IntPtr hWnd);

    private const int SW_RESTORE = 9;

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

        if (handle != IntPtr.Zero)
        {
            var isVisible = IsWindowVisible(handle);
            var showResult = ShowWindow(handle, SW_RESTORE);
            var setResult = SetForegroundWindow(handle);
        }
    }
}

Kết quả:

Phương thức ShowWindow trả về false và cửa sổ HideWindow xuất hiện đen màn hình.

Giải pháp:

  1. Thay đổi cách ẩn cửa sổ HideWindow:

Thay vì sử dụng this.Hide(), sử dụng ShowWindow(handle, SW_HIDE); từ thư viện Win32.

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

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Win32Hide();
    }

    private void Win32Hide()
    {
        var handle = new WindowInteropHelper(this).Handle;
        ShowWindow(handle, SW_HIDE);
    }

    private const int SW_HIDE = 0;

    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
}
  1. Phương thức trong cửa sổ ActiveWindow giữ nguyên.

Kết quả:

Phương thức ShowWindow(intptr, SW_RESTORE) trong cửa sổ ActiveWindow trả về true và cửa sổ được kích hoạt và hiển thị thành công.

Thẻ: WPF Win32 ShowWindow Hide C#

Đăng vào ngày 12 tháng 7 lúc 19:32