C# 显示、隐藏窗口对应的任务栏

作者:唐宋元明清2188 时间:2023-06-13 03:57:32 

WPF中全屏窗口,会自动隐藏任务栏。

那非全屏窗口如何隐藏任务栏?甚至有没有一种场景,隐藏任务后自定义一套系统任务栏来显示?

以下会分阶段讲述一些概念,任务栏、查找窗口、控制窗口显示。

1. 主屏任务栏

任务栏,其实也是一个窗口,主屏的任务栏名称是"Shell_TrayWnd"。

所以可以通过名称查找窗口,然后对窗口进行显示、隐藏操作。

以下是主屏幕任务栏的控制操作:


public static class ScreenTaskBar
   {
       private const int SwHide = 0; //隐藏窗口
       private const int SwRestore = 9;//还原窗口

[DllImport("user32.dll")]
       private static extern int ShowWindow(int hwnd, int nCmdShow);
       [DllImport("user32.dll")]
       private static extern int FindWindow(string lpClassName, string lpWindowName);
       /// <summary>
       /// 显示任务栏
       /// </summary>
       public static void Show()
       {
           ShowWindow(FindWindow("Shell_TrayWnd", null), SwRestore);
       }
       /// <summary>
       /// 隐藏任务栏
       /// </summary>
       public static void Hide()
       {
           ShowWindow(FindWindow("Shell_TrayWnd", null), SwHide);
       }
   }

2.多屏任务栏

如果是多屏,对任务栏进行处理的场景,一般是对窗口所对应的任务栏操作。

如何获取任意窗口所在的任务栏呢?既然任务栏也是窗口,那么我们的关注点就是如何找到任务栏窗口了。

User32有EnumWindows函数,可以遍历当前电脑的所有窗口。


private delegate bool EnumWindowProc(IntPtr hWnd, int lParam);
    [DllImport("user32")]
   private static extern bool EnumWindows(EnumWindowProc lpEnumFunc, int lParam);

EnumWindowProc定义了委托的处理。添加回调方法,返回的参数是句柄信息:


bool OnEnumWindow(IntPtr hWnd, int lparam)
    {
       //添加代码XXX
        return true;
    }

然后可以在回调内部添加代码,根据窗口的句柄信息,我们去拿窗口的一些信息,类名、窗口标题、窗口的Bounds(位置、大小)


[DllImport("user32")]
   private static extern int GetClassName(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
   [DllImport("user32")]
   private static extern int GetWindowText(IntPtr hWnd, StringBuilder lptrString, int nMaxCount);
   [DllImport("user32")]
   private static extern bool GetWindowRect(IntPtr hWnd, ref LPRECT rect);

以下是部分遍历出来的窗口类信息:

C# 显示、隐藏窗口对应的任务栏

所以,可以筛选出那些以TrayWnd字符串结尾的,这些都是任务栏窗口。

之后就是如何筛选出我们想要的任务栏,即窗口对应的任务栏。

窗口与任务栏,是通过屏幕关联在一起的。通过窗口获取当前屏幕信息,任务栏的Bounds如果与屏幕Bounds相交,则说明此任务栏在此屏幕内。


var intPtr = new WindowInteropHelper(window).Handle;//获取当前窗口的句柄
    var screen = Screen.FromHandle(intPtr);//获取当前屏幕
    var currentScreenBounds = screen.Bounds;
    var taskBars = windows.Where(i => i.ClassName.Contains("TrayWnd"));
    var currentTaskBar = taskBars.FirstOrDefault(i => i.Bounds.IntersectsWith(currentScreenBounds));

获取任务栏,也可以通过任务栏的句柄获取屏幕,与主窗口所在屏幕判断是否同一个。

获取了指定的任务栏信息后,我们就可以控制任务栏显示、隐藏了。调用下user32下函数ShowWindow即可:


private const int SwHide = 0; //隐藏窗口
   private const int SwRestore = 9;//还原窗口
   /// <summary>
   /// 通过句柄,窗体显示函数
   /// </summary>
   /// <param name="hWnd">窗体句柄</param>
   /// <param name="cmdShow">显示方式</param>
   /// <returns>返回成功与否</returns>
   [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
   public static extern bool ShowWindow(IntPtr hWnd, int cmdShow);

这里的ShowWindow,与上面默认任务栏操作所调用的ShowWindow不一样,句柄参数是IntPtr

来源:https://www.cnblogs.com/kybs0/p/15360894.html

标签:C#,显示,隐藏,任务栏
0
投稿

猜你喜欢

  • Activiti如何启动流程并使流程前进

    2023-11-18 18:38:51
  • iOS获取AppIcon and LaunchImage's name(app图标和启动图片名字)

    2022-01-11 02:39:14
  • Java非法字符: ‘\\ufeff‘问题及说明

    2023-02-01 09:06:07
  • SpringBoot在Controller层接收参数的n种姿势(超详细)

    2023-01-28 00:54:39
  • Java AtomicInteger类使用方法实例讲解

    2023-01-18 16:22:49
  • 十种JAVA排序算法实例

    2022-11-11 00:19:54
  • 深入讲解基于JDK的动态代理机制

    2022-07-19 07:13:32
  • 详解WMI RPC 服务器不可用的解决方案

    2023-09-14 14:51:54
  • 详解IDEA启动多个微服务的配置方法

    2023-11-24 09:22:24
  • JAVA MyBatis入门学习过程记录

    2022-04-23 13:49:24
  • Java自定义线程池的实现示例

    2022-01-23 01:28:04
  • Java8中的LocalDateTime和Date一些时间操作方法

    2022-06-28 12:28:57
  • SpringBoot集成整合JWT与Shiro流程详解

    2022-09-06 06:33:23
  • Java Map简介_动力节点Java学院整理

    2023-06-03 20:27:03
  • Java类锁、对象锁、私有锁冲突测试

    2022-04-25 05:06:22
  • springboot项目快速搭建的方法步骤

    2021-11-07 04:55:51
  • MyBatis特殊字符转义拦截器问题针对(_、\\、%)

    2023-09-12 00:46:39
  • c#实现输出的字符靠右对齐的示例

    2023-02-26 12:23:39
  • java基于netty NIO的简单聊天室的实现

    2023-11-18 15:29:43
  • 在启动后台 jar包时,使用指定的 application.yml操作

    2023-01-08 20:10:12
  • asp之家 软件编程 m.aspxhome.com