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

作者:唐宋元明清2188

WPF中全屏窗口,会自动隐藏任务栏,那非全屏窗口如何隐藏任务栏?甚至有没有一种场景,隐藏任务后自定义一套系统任务栏来显示?这篇文章主要介绍了C# 显示、隐藏窗口对应的任务栏,需要的朋友可以参考下

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

到此这篇关于C# 显示、隐藏窗口对应的任务栏的文章就介绍到这了,更多相关C# 显示隐藏窗口任务栏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • Oracle中for循环的使用方法
    Oracle中for循环的使用方法
    2022-08-08
  • C# 获取文件夹里所有文件名的详细代码
    C# 获取文件夹里所有文件名的详细代码
    2022-08-08
  • C# 将 Stream 保存到文件的方法
    C# 将 Stream 保存到文件的方法
    2022-08-08
  • UpdateLayeredWindow实现任意异形窗口使用详解
    UpdateLayeredWindow实现任意异形窗口使用详解
    2022-08-08
  • C#利用Spire.Pdf包实现为PDF添加数字签名
    C#利用Spire.Pdf包实现为PDF添加数字签名
    2022-08-08
  • C#实现文件与字符串互转的方法详解
    C#实现文件与字符串互转的方法详解
    2022-08-08
  • 基于C#实现一个简单的FTP操作工具
    基于C#实现一个简单的FTP操作工具
    2022-08-08
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2023 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号