找回密码
 立即注册
首页 业界区 安全 记录一下WPF 调用 窗口自带的Hide() 方法,用 Win32 的S ...

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

任俊慧 昨天 21:57
最近有小伙伴的应用里边,需要跨进程的方式,显示隐藏窗口。
在WPF 自身的应用中,使用的最多的就是 窗口自带的 Hide()Show() 方法
1、创建一个HideWindow的窗口,添加按钮,在点击按钮的时候,调用Hide()方法。
1.png

 
  1. public partial class MainWindow : Window
  2. {
  3.     public MainWindow()
  4.     {
  5.         InitializeComponent();
  6.     }
  7.     private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
  8.     {
  9.          this.Hide();
  10.     }
  11. }
复制代码
 
2、创建一个激活的窗口,添加按钮,在点击按钮的时候,将HideWindow的窗口激活并显示
2.png

 
  1. public partial class MainWindow : Window
  2. {
  3.     public MainWindow()
  4.     {
  5.         InitializeComponent();
  6.     }
  7.     [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
  8.     public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  9.     [DllImport("user32.dll")]
  10.     private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  11.     [DllImport("user32.dll")]
  12.     private static extern bool SetForegroundWindow(IntPtr hWnd);
  13.     [DllImport("user32.dll")]
  14.     private static extern bool SetActiveWindow(IntPtr hWnd);
  15.     [DllImport("user32.dll", SetLastError = true)]
  16.     private static extern bool IsWindowVisible(IntPtr hWnd);
  17.     [DllImport("user32.dll", SetLastError = true)]
  18.     private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
  19.         int X, int Y, int cx, int cy, uint uFlags);
  20.     // 窗口显示状态常量
  21.     private const int SW_SHOWNOACTIVATE = 4;  // 显示窗口但不激活
  22.     private const int SW_SHOWNA = 8;           // 显示窗口但不激活
  23.     private const int SW_SHOWMINIMIZED = 2;    // 显示最小化窗口
  24.     // 窗口定位常量
  25.     private const uint SWP_NOACTIVATE = 0x0010;
  26.     private const uint SWP_NOZORDER = 0x0004;
  27.     private const uint SWP_NOSIZE = 0x0001;
  28.     private const uint SWP_NOMOVE = 0x0002;
  29.     private const uint SWP_SHOWWINDOW = 0x0040;
  30.     // 定义窗口状态常量
  31.     private const int SW_RESTORE = 9; // 激活并显示窗口。如果窗口最小化或最大化,系统将其还原到原始大小和位置。
  32.     private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
  33.     {
  34.         var intptr = FindWindow(null, "HideWindow");
  35.         if (intptr != IntPtr.Zero)
  36.         {
  37.             var isVisible = IsWindowVisible(intptr);
  38.             var showResult = ShowWindow(intptr, SW_RESTORE);
  39.             //uint flags = SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW;
  40.             //SetWindowPos(intptr, IntPtr.Zero, 0, 0, 0, 0, flags);
  41.             isVisible = IsWindowVisible(intptr);
  42.             var setResult = SetForegroundWindow(intptr);
  43.         }
  44.     }
  45. }
复制代码
结果如下:
在设置ShowWindow的方法,返回的是False,并且HideWindow的窗口是黑屏的
3.png

 

 
 解决方法:
1、修改HideWindow 窗口的隐藏方式:
通过调用Win32的  ShowWindow(handle, SW_Hide); 
  1. public partial class MainWindow : Window
  2. {
  3.      public MainWindow()
  4.      {
  5.          InitializeComponent();
  6.      }
  7.      private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
  8.      {
  9.          Win32Hide();
  10.          // this.Hide();
  11.      }
  12.      private void Win32Hide()
  13.      {
  14.          var handle = new WindowInteropHelper(this).Handle;
  15.          ShowWindow(handle, SW_Hide);
  16.      }
  17.      private int SW_Hide = 0;
  18.      [DllImport("user32.dll")]
  19.      private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  20. }
复制代码
2、ActiveWindow 的窗口的方法保持不变
结果如下:
ActiveWindow 的 窗口var showResult = ShowWindow(intptr, SW_RESTORE); 返回之为True,并且窗口可以激活并显示
5.png

6.png

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册