C# 显示、隐藏窗口对应的任务栏
WPF中全屏窗口,会自动隐藏任务栏。
那非全屏窗口如何隐藏任务栏?甚至有没有一种场景,隐藏任务后自定义一套系统任务栏来显示?
以下会分阶段讲述一些概念
1. 主屏任务栏
任务栏,其实也是一个窗口,主屏的任务栏名称是"Shell_TrayWnd"。
所以可以通过名称查找窗口,然后对窗口进行显示、隐藏操作。
以下是主屏幕任务栏的控制操作:
1 public static class ScreenTaskBar
2 {
3 private const int SwHide = 0; //隐藏窗口
4 private const int SwRestore = 9;//还原窗口
5
6 [DllImport("user32.dll")]
7 private static extern int ShowWindow(int hwnd, int nCmdShow);
8 [DllImport("user32.dll")]
9 private static extern int FindWindow(string lpClassName, string lpWindowName);
10 /// <summary>
11 /// 显示任务栏
12 /// </summary>
13 public static void Show()
14 {
15 ShowWindow(FindWindow("Shell_TrayWnd", null), SwRestore);
16 }
17 /// <summary>
18 /// 隐藏任务栏
19 /// </summary>
20 public static void Hide()
21 {
22 ShowWindow(FindWindow("Shell_TrayWnd", null), SwHide);
23 }
24 }
2. 多屏任务栏
如果是多屏,对任务栏进行处理的场景,一般是对窗口所对应的任务栏操作。
如何获取任意窗口所在的任务栏呢?既然任务栏也是窗口,那么我们的关注点就是如何找到任务栏窗口了。
User32有EnumWindows函数,可以遍历当前电脑的所有窗口。
1 [DllImport("user32")]
2 private static extern bool EnumWindows(WndEnumProc lpEnumFunc, int lParam);
WwdEnumProc是个回调方法,返回的参数是句柄信息:
1 bool OnEnumWindow(IntPtr hWnd, int lparam)
2 {
3 //添加代码XXX
4 return true;
5 }
然后可以在回调内部添加代码,根据窗口的句柄信息,我们去拿窗口的一些信息,类名、窗口标题、窗口的Bounds(位置、大小)
1 [DllImport("user32")]
2 private static extern int GetClassName(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
3 [DllImport("user32")]
4 private static extern int GetWindowText(IntPtr hWnd, StringBuilder lptrString, int nMaxCount);
5 [DllImport("user32")]
6 private static extern bool GetWindowRect(IntPtr hWnd, ref LPRECT rect);
以下是一些遍历出来的窗口信息:
所以,可以筛选出那些以TrayWnd字符串结尾的,这些都是任务栏窗口。
之后就是如何筛选出我们想要的任务栏,即窗口对应的任务栏。
窗口与任务栏,是通过屏幕关联在一起的。通过窗口获取当前屏幕信息,任务栏的Bounds如果与屏幕Bounds相交,则说明此任务栏在此屏幕内。
1 var intPtr = new WindowInteropHelper(window).Handle;//获取当前窗口的句柄
2 var screen = Screen.FromHandle(intPtr);//获取当前屏幕
3 var currentScreenBounds = screen.Bounds;
4 var taskBars = windows.Where(i => i.ClassName.Contains("TrayWnd"));
5 var currentTaskBar = taskBars.FirstOrDefault(i => i.Bounds.IntersectsWith(currentScreenBounds));
获取任务栏,也可以通过任务栏的句柄获取屏幕,与主窗口所在屏幕判断是否同一个。
获取了指定的任务栏信息后,我们就可以控制任务栏显示、隐藏了。调用下user32下函数ShowWindow即可:
1 private const int SwHide = 0; //隐藏窗口
2 private const int SwRestore = 9;//还原窗口
3 /// <summary>
4 /// 通过句柄,窗体显示函数
5 /// </summary>
6 /// <param name="hWnd">窗体句柄</param>
7 /// <param name="cmdShow">显示方式</param>
8 /// <returns>返回成功与否</returns>
9 [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
10 public static extern bool ShowWindow(IntPtr hWnd, int cmdShow);
C# 显示、隐藏窗口对应的任务栏的更多相关文章
- xshell显示隐藏窗口页签
有时候不知道操作说了什么红框中的页签会消失,可以ctrl+shift+t 控制显示隐藏
- 根据权限显示隐藏SharePoint 2010快速启动栏的链接
转:http://www.360sps.com/Item/ShowAndHiddenLink.aspx 在SharePoint 2010的快速启动栏中可以根据权限来显示或隐藏列表.库.网站的链接,如果 ...
- javascript进行百度换肤 和显示隐藏一个窗口的操作
简单的运用javascript来进行百度换肤的操作 <!DOCTYPE html> <html lang="en"> <head> <me ...
- 怎样让窗口不显示在任务栏和ALT+TAB中(隐藏窗口再嵌套,几乎是万能的办法)
之前想弄个像QQ旋风那样的悬浮窗口,就研究了下怎么让窗口不显示在任务栏中,方法其实很简单就是将窗口的扩张属性设置成WS_EX_TOOLWINDOW,MSDN中对该属性有详细介绍,代码如下: ::Set ...
- linux如何隐藏和显示所有窗口?
centos7 基本上就跟fedora23是一样的了, 也许它们使用的内和是一样的, fedora23使用的是4.2.3, 所以使用fedora对使用centos和redhat是有优势和好处福利的. ...
- Excel在任务栏中只显示一个窗口的解决办法
Excel在任务栏中只显示一个窗口的解决办法 以前朋友遇到过这个问题,这次自己又遇到了,习惯了以前的那种在任务栏中显示全部窗口,方便用Alt+Tab键进行切换. 如果同时打开许多Excel工作簿, ...
- iframe的滚动栏问题:显示/隐藏滚动栏
iframe 问题2008-01-22 16:37****** 显示 iframe 内容 XHTML 1.0 Transitional 标准不能显示 <!DOCTYPE html PUBLI ...
- WPF中任务栏只显示主窗口
我们在用WPF开发的时候,常常会遇到在主窗口打开的情况下,去显示子窗口,而此时任务栏同时显示主窗口与子窗口.这样看起来很不美观.所以在弹出子窗口之前,设置它的几个相应属性,便不会出现这种问题了. // ...
- WinForm实现类似QQ停靠,显示隐藏过程添加特效效果
原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右 ...
随机推荐
- msql中@RequestParam、@Param、@PathVariable的用法
@RequestParam的用法 1.可以对传入参数指定参数名,将请求参数绑定至方法参数 // 下面的对传入参数指定为aa,如果前端不传aa参数名,会报错 @RequestParam(value=&q ...
- JSP编码问题
JSP的开头内容: 1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 ...
- 了解Prometheus
了解Prometheus 标签(空格分隔): 监控 介绍 Prometheus是用来收集和存储服务器的实时数据(比如:CPU.硬盘.服务响应.日志等),通过其丰富的运算函数,可以计算得到很多的服务性能 ...
- 🏆【Alibaba微服务技术系列】「Dubbo3.0技术专题」回顾Dubbo2.x的技术原理和功能实现及源码分析(温故而知新)
RPC服务 什么叫RPC? RPC[Remote Procedure Call]是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范.它允许程序调用另一个地址空间(通常是共享网络的另 ...
- H5、C3基础知识笔记
HTML5 本文内容参考于"HTML5|W3scool"教程 简介 是最新的 HTML 标准,拥有新的语义.图形以及多媒体元素 提供了新的 API 简化了 web 应用程序的搭建 ...
- 云效x钉钉:让研发工作更简单
云效x钉钉:让研发工作更简单,奔走相告,云效&钉钉集成实现组织架构.成员同步以及消息通知啦! 我们知道云效致力于智能化.安全可追溯.高效.简单.灵活,「云效新一代企业级DevOps平台」阿里云 ...
- yield表达式 python语法
可以先看下这篇文章:http://www.cnblogs.com/jiangtu/articles/6662043.html 原篇是转载的:http://www.python-tab.com/html ...
- HCNP Routing&Switching之动态路由协议IS-IS基础
前文我们了解了OSPF的特殊区域相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15236330.html:今天我们来聊一聊另一动态路由协议IS-IS相 ...
- c# 递归树形菜单
首先创建模型类Menus public class Menus { //菜单Id public int Id { get; set; } //菜单名 public string MenuName { ...
- EL-ADMIN学习笔记
一,支持接口限流,避免恶意请求导致服务层压力过大 常见的限流功能一般有两个关注点: 1.限流原则,即以什么样的条件对请求进行识别以及放行.常见的作法是给予每个调用API的系统不同的唯一编码,用于监控某 ...