文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

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# 显示隐藏窗口任务栏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯