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() và Show().
- Tạo một cửa sổ
HideWindowvới nút, khi nhấp vào nút, gọi phương thứcHide().
public partial class HideWindow : Window
{
public HideWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.Hide();
}
}
- 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:
- 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);
}
- Phương thức trong cửa sổ
ActiveWindowgiữ 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.