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);
以下是部分遍历出来的窗口类信息:
所以,可以筛选出那些以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


猜你喜欢
- 其实嵌套滚动已经算一个比较常见的特效了,下面这个动图就是嵌套滚动的一个例子:看到这个动效,大家可能都知道可以用CoordinatorLayo
- 有了Eureka服务注册发现、Hystrix断路器、Ribbon服务调用负载均衡,以及spring cloud config 集群配置中心,
- Java中有哪些队列ArrayBlockingQueue 使用ReentrantLockLinkedBlockingQueue 使用Reen
- 1、RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;2、Retent
- 静态变量静态变量位于栈上,它是一个全局变量,在编译期就已经生成。public class Cow{public static int cou
- 游戏中有时候会见到图片轮播的效果,那么这里就自己封装了一个,包括自动轮播、切页按钮控制、页码下标更新、滑动轮播、切页后的回调等等 。下面,先
- Java画图 给图片底部添加文字标题需求给图片底部添加文字编号import java.awt.Color;import java.awt.F
- 继承什么是继承呢?继承(Inheritance)是一种联结类与类的层次模型。指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接
- 前言线程是一个程序内部的顺序控制流。cpu实际上在一个时间点上,只执行一个。只不过我们把cup分成了多个时间片,由于速度很快,我们看起来像是
- 我就废话不多说了,大家还是直接看代码吧~ @Test void testJava8ForeachMap() { Map<String,
- 本文实例为大家分享了jdk1.7配置教程,供大家参考,具体内容如下第一步:下载jdk1.7下载地址:链接 密码: wrmf第二步:
- 关于java图片验证码的文章最近更新了不少,帮助大家掌握java验证码的生成技术,下文为大家分享了java生成图片验证码最简单的方法,供大家
- 本文实例为大家分享了Unity实现ScrollView滑动吸附的具体代码,供大家参考,具体内容如下最近在做一个展示模块的时候遇到了一个需要实
- 一、效果图本控件已上传Github,欢迎Star和Fork,项目地址:CircleWaterWaveView二、设计思路观察效果图,可以看出
- 配置文件请看上篇Java实现redis https://www.jb51.net/article/190922.htm下面测试redis的集
- 一. 异常的定义在《Java编程思想》中这样定义 异常:阻止当前方法或作用域继续执行的问题。虽然java中有异常处理机制,但是要明确一点,决
- 全面解析java注解Java中的常见注解 a.JDK中的注解 @Override 覆盖父类或者父接口的方
- SpringBoot整合Mybatis自定义 * 不起作用Mybatis插件生效的方式:1. 原始的读取mybatis-config.xml
- 本文讲述了Java获取彩色图像中的主色彩的实例代码。分享给大家供大家参考,具体如下:一:基本思路对于一张RGB色彩空间的彩色图像,很多时间我
- 1.map遍历快速实现边距,文字自适应改变大小Container( // padding: EdgeI