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停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右 ...
随机推荐
- c++本地动态连接库代码
c++本地动态连接库代码 1 #pragma once 2 #include "stdafx.h" 3 4 #ifdef PERSON_EXPORTS 5 #define PERS ...
- Centos7 安装 redis4.x
一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@iZwz991stxd ...
- 未解决的html页面banner对不齐
莫名其妙的问题,记录等待解决: 怎么讲呢?就是可能真的没有理解这句话,浏览器是否是需要这句话的,思考! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML ...
- c++中的一些会用到的函数
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main() { 5 string s ...
- docker安装与配置gitlab详细过程
docker安装与配置gitlab详细过程 1.打开网易镜像中心 https://c.163yun.com/hub#/m/home/ 2.搜索gitlab,获取下载地址.例如:docker pull ...
- ES6扩展——数值扩展
1.0o代表八进制 0b代表二进制 ,通过Number()可转为10进制: //0o 0O octanary八进制 //0b 0B binary二进制 console.log(0o16); //14 ...
- ubuntu下安装teamiewer
下载地址: https://download.teamviewer.com/download/linux/teamviewer_amd64.deb 如果无法下载,则在https://www.teamv ...
- 测试Kaggle kernel commit 是否会删除以前的output
在kaggle上创建kernel,加入如下代码. 连续运行两次,可以看到保存的文件名字不一样,且无论运行错少次,都只有一个输出文件. 这说明,kaggle上的kernel每次commit运行,都会清空 ...
- 经典深度学习CNN总结 - LeNet、AlexNet、GoogLeNet、VGG、ResNet
参考了: https://www.cnblogs.com/52machinelearning/p/5821591.html https://blog.csdn.net/qq_24695385/arti ...
- mybatis第一个程序随笔
今天继续学习了解如何写一个mybatis程序 创建了Dao层 1.1 创建一个UserDao接口 1.2 创建UserMapper.xml文件 在mybaits中文手册查找配置信息 <?xml ...