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
猜你喜欢
- 由于毕业后工作没有对接到专业问题,导致四五年没有碰过Winform程序了。突然由于工作问题,为了方便自己,所以想自己写写小winform小软
- 开发工具下载:Tomcat下载:wget http://learning.happymmall.com/tomcat/apache-tomc
- 引言:编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就工作中的一些体会和经验做相关的阐述,不对的地方请各位指教。第1招:以空间换
- 话不多说,请看代码:/// <summary> /// 获取客户端IP /// </summary
- Java中的动态和静态编译实例详解首先,我们来说说动态和静态编译的问题。 Q: java和javascript有什么
- 本文研究的主要是Java编程Nashorn的相关内容,具体如下。Nashorn是什么Nashorn,发音“nass-horn”,是德国二战时
- 关于ListBoxListBox是WinForm中的列表控件,它提供了一个项目列表(一组数据项),用户可以选择一个或者多个条目,当列表项目过
- 在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出。对于excel2003
- ObjectUtils.isEmpty()和null区别分配内存和赋值的区别isEmpty():判断值是否为空,即使已经分配内存,但没有赋值
- 上一集中我们说到需要用Java来制作一个知乎爬虫,那么这一次,我们就来研究一下如何使用代码获取到网页的内容。首先,没有HTML和CSS和JS
- 修改整理的一个通用类,用来操作oracle数据库 十分的方便,支持直接操作sql语句和Hash表操作.现在修补MIS我都用这个类,节约了大
- 前言说到对集合去重处理,第一时间想到的肯定是Linq的Distinct扩展方式,对于一般的值类型集合去重,很好处理,直接list.Disti
- 一、Arthas官方文档https://arthas.aliyun.com/doc/二、springBoot整合方式1、pom文件引入<
- 那么Http协议中的Multipart是个什么东东?下面是摘抄http协议1.1的一段话:
- 方法1:import java.net.HttpURLConnection;import java.net.URL;import org.j
- 概述ConcurrentHashMap(CHM)是日常开发中使用频率非常高的一种数据结构,想对于普通的HashMap,CHM提供了线程安全的
- 1 线程池的优势总体来说,线程池有如下的优势:(1)降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。(2)提高响应速度。
- 一、导言1.1 介绍桥接模式及其应用背景桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以
- Java语言是一种半编译半解释的语言。Java的用户程
- TestCar.javapublic class TestCar { public static voi