最近有小伙伴的应用里边,需要跨进程的方式,显示隐藏窗口。
在WPF 自身的应用中,使用的最多的就是 窗口自带的 Hide()和Show() 方法
1、创建一个HideWindow的窗口,添加按钮,在点击按钮的时候,调用Hide()方法。
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- }
- private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
- {
- this.Hide();
- }
- }
复制代码
2、创建一个激活的窗口,添加按钮,在点击按钮的时候,将HideWindow的窗口激活并显示
- 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的窗口是黑屏的
解决方法:
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,并且窗口可以激活并显示
代码Demo 链接 :wutangyuan/wutyDemo: Demo代码备份
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |