零、前言废话

之前因为工作需要与便于偷懒总结,便在一个阳光明媚的下午写了一个非常简单的Winform应用作为日常记录工作内容和一键生成工作周报的工具,当时因为基本功能都完成了,便没有继续优化细节。今日又是一个风和日丽午后,左右无事,便起了想要优化一下程序的念头。

自己看着自己的程序发呆,不一会便想到了需要优化的部分——不能每次用完就退出,用的时候再打开吧?虽然程序很小用的资源不多,但是用户体验很不好的呀!于是便想到了不如把程序隐藏到系统托盘,用的时候点开用,不用的时候挂在后台瑟瑟发抖多好。综上,今天的优化目标来了。

一、隐藏到托盘

想要隐藏到托盘,首先就要能有个图标放在系统托盘,不然你把程序隐藏了别个怎么点开嘛...那么怎么能够让他在托盘里显示呢?我猜肯定有个控件吧。于是去工具箱里翻找了一下,凭借出色的英语水平和有道词典,终于找到了控件NotifyIcon!那就赶紧把他拖到我们的Form里吧!

然后我们良好的编程习惯驱使我们去属性里给他改个名字改改文字啥的;暂时先改Text和Icon就好啦  这俩分别是显示出的文字和显示的图标(说的跟谁不知道一样!)。然后顺便还看到了ContextMenuStrip属性和Visible属性,先偷偷记下来一会会用到。

我们有了托盘区的图标,就要让窗体最小化时只在托盘区显示而不要在任务栏中显示出来,这样才叫隐藏嘛!于是去找到Form窗体的一个事件SizeChanged,双击进去编写隐藏任务栏的方法:

        /// <summary>/// 当窗体最小化时隐藏任务栏的图标只显示托盘区图标/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void MainForm_SizeChanged(object sender, EventArgs e){//判断窗体是否将要最小化if (WindowState == FormWindowState.Minimized){//隐藏任务栏区图标this.ShowInTaskbar = false;//图标显示在托盘区notifyIcon.Visible = true;}}

然后!我们切换到NotifyIcon控件事件的标签,找到鼠标双击事件(MouseDoubleClick),然后在后面自己起个方法名,我觉得他默认的notifyIcon_MouseDoubleClick就很好很直观嘛!点进去开始编写相应的功能代码~(没错,前面看到的Visible属性正是用来设置是否可见的)

        /// <summary>/// 托盘区图标双击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e){if (WindowState == FormWindowState.Minimized){//把最小化的窗体显示出来WindowState = FormWindowState.Normal;//激活窗体并赋予焦点this.Activate();//任务栏区显示图标this.ShowInTaskbar = true;//托盘区图标隐藏notifyIcon.Visible = true;}  }

好啦,最基本的双击托盘显示功能就OK啦,不过在我们使用一下之后便会发现,这样只能在窗体被最小化时双击显示,可是当窗体失去焦点被盖在其他应用下面时我们再点图标并不能让窗体蹦出来。于是对上面的代码进行小小的优化,得到以下代码:

        /// <summary>/// 托盘区图标双击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e){if (WindowState == FormWindowState.Minimized){//把最小化的窗体显示出来  WindowState = FormWindowState.Normal;//激活窗体并赋予焦点this.Activate();//任务栏区显示图标this.ShowInTaskbar = true;//托盘区图标隐藏notifyIcon.Visible = true;}else{               this.Activate();//将窗体前置this.TopMost = true;//解除窗体前置this.TopMost = false;//任务栏区显示图标this.ShowInTaskbar = true;//托盘区图标隐藏notifyIcon.Visible = true;}}

这样一来,即使我们的应用被压在五指山下都能通过双击图标把他弄出来啦。可是托盘的图标只能用来双击嘛?那用处好小哦。能不能像别的应用那样,右键的时候弹出菜单呢?当然可以!依然是去工具箱里翻找,找到ContextMenuStrip控件,这个控件专门用来设置右键菜单的。我们先把他从工具箱里拖出来,就先随便扔在我们的Form上吧!

拖出来以后,还是按照习惯给他改改基础属性(其实就改个名字)。接着就可以在上图画圈处写自己的菜单啦!就先写显示和退出好了!

写好菜单之后,我们要把菜单绑定到我们的托盘图标上去,这样才能在右键托盘的时候弹出我们想要的菜单。选中之前加入的NotifyIcon控件,查看其属性,找到我们之前特别关注到的ContextMenuStrip属性,点击后面的下拉框,选中我们刚刚改了名字的那个ContextMenuStrip控件,就绑定上啦!

现在运行一下会发现一切都如我们设想的那样进行着,托盘有图标可以显示窗体,还可以右键看到菜单,接下来就该编写菜单的功能了!

选中我们之前加入的ContextMenuStrip控件,双击我们要编写的那条菜单编译器就可以自动为我们生成空白方法!

于是便可以写下如下代码:

        private void 显示程序ToolStripMenuItem_Click(object sender, EventArgs e){//将窗体显示出来WindowState = FormWindowState.Normal;}private void 完全退出ToolStripMenuItem_Click(object sender, EventArgs e){// 关闭所有的线程this.Dispose();this.Close();}

这样一来就OK啦!现在的功能已经比之前强大啦!

二、窗口置顶

在上面的功能实现后,我突然觉得右键菜单只有两个选项会不会太单薄,刚好之前在双击显示窗体的时候发现了MainForm的TopMost属性有点意思,那不如干脆来做个窗口置顶吧!

说干就干,于是先在菜单里加一条“保持最前”。加完之后,我陷入了沉思......怎样在一条菜单里控制保持最前和不保持呢?突然想起别人的程序里好像菜单里可以打钩来着!那我不如也把“保持最前”设置为可勾选,这样一来不就可以了嘛!

选中我们之前加入的ContextMenuStrip控件,单击刚刚输入的“保持最前”那条,果然在属性里找到了Check三兄弟,分别是Checked、CheckOnClick、CheckState。看字面意思,Checked应该就是是否允许勾选属性了吧!把他改成True;第二个CheckOnClick看起来应该是在点击这条的时候就把他打上勾,这么方便的功能我们当然也设成True啊!第三个CheckState明显就是默认状态嘛,那必然是Unchecked呀。然后我们就会发现在CheckState改成Unchecked以后,Checked直接就变成False了......emmmmmm......原来这个Checked不是指是否允许勾选呀...查了一下发现这个Checked就是用来改变状态的  好哒,这下明白了!

这个解决了那么后面的工作就非常简单了!写就完事儿了!

        private void 保持最前ToolStripMenuItem_Click(object sender, EventArgs e){if (!this.保持最前ToolStripMenuItem.Checked){//解除窗体前置this.TopMost = false;}else{//还原窗体显示    WindowState = FormWindowState.Normal;//焦点激活this.Activate();//将窗体前置this.TopMost = true;}}

这样一来,我们的目的就完全达到了呢,真是一次成功的优化!

(来自一名菜鸡程序猿的随手记录)

Winform 为程序设置隐藏到托盘功能和将窗口置顶相关推荐

  1. Typora:简介和常用功能集锦,窗口置顶,自定义快捷功能,粘贴图片自定义保存位置

    ✨ Waht is Typora?A minimal markdown editor, markdown reader. 下载Typora可参考该博客:[Typora 免费Beta版本(Window+ ...

  2. 使用window便签功能实现桌面窗口置顶

    在百度中搜索下载[DeskPins绿色汉化版] https://dl-download.csdn.net/down11/20200708/0de0e95a267321e174e1ec3077edaba ...

  3. 窗口置顶(置于桌面所有程序之上)VC/MFC 怎么将窗口置顶

    软件界面全屏显示后,需要把窗体置于其他桌面程序之上,但总是置于其他弹出框之下,会造成用户忽略了导致用户不明什么原因. 百度查了好多方法总是失败. 后来查到了CSND的一个帖子http://bbs.cs ...

  4. 设置窗口置顶_这三个应用,每一个都能让你置顶。

    | 当你有多个窗口同时打开,置顶其中某个或某些,能够方便你对比.学习.抄写--但不是所有软件都有这个功能,所以你需要今天的小干货.| ----------- 你的高效生活视频书. 将窗口置顶,可以方便 ...

  5. cmd设置总是置顶_windows 下如何让一个窗口置顶?

    嘿,我也来分享三个,前两个可以忽略,第三个可能是最佳选择. 让 Win 更香的三个窗口置顶应用https://www.zhihu.com/video/1241767230004113408 将窗口置顶 ...

  6. 电脑桌面云便签怎么通过便签快捷键设置窗口置顶或置底?

    电脑桌面云便签Windows版既支持设置透明皮肤颜色,也可以使用便签快捷键,快捷打开云便签的某些功能或进行相关设置.那么,电脑桌面云便签怎么通过便签快捷键进行窗口置顶或置底的快捷操作设置呢? 一.打开 ...

  7. 华硕电脑如何设置记事本软件窗口置顶

    华硕电脑如何设置记事本软件窗口置顶?窗口置顶能让记事本一直保留在电脑屏幕的前端,随时都可以查看修改记事本内容.我们都知道电脑自带的记事本是无法设置窗口置顶的.如果你需要把记事本软件设置为窗口置顶的话, ...

  8. QT程序 windows窗口置顶和linux窗口置顶遇到的问题和解决方案

    一.QT 窗口置顶 一般情况下,我们开发QT桌面应用程序如需用到窗口置顶操作时,会这样做: setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHin ...

  9. 【QT学习】如何隐藏标题栏、任务栏图标及子窗口置顶?(附常用窗口标志)

    文章目录 前言 一.标题栏隐藏 二.子窗口置顶 三.任务栏图标隐藏 四.单击任务栏图标显示(隐藏)窗口 附:QT常用窗口标志 总结 前言    本篇,将介绍如何隐藏窗口标题栏.任务栏图标以及子窗口置顶 ...

最新文章

  1. Android 中文API (91) —— GestureDetector
  2. Ilist与List的区别
  3. 在GridView中使用Cache
  4. PyTorch报错No module named ‘transforms‘
  5. 解决Centos 7 VNC黑屏
  6. 08-SSH综合案例:前台用户模块:注册页面的前台JS校验
  7. Mysql的多表查询(表添加,多表查询练习:笛卡尔积、内连接、外连接、子查询、UNION组合查询)
  8. python对ip地址排序、对列表进行去重
  9. linux驱动架构变化,Linux网卡驱动架构分析
  10. echarts图表随着窗口大小改变自刷新问题解决
  11. 如何在github用git Pages上传自己在本地做的项目?
  12. 用低代码+BPM赋能知识文档管理系统
  13. thinkpad选择启动项_thinkpad怎么从u盘启动|联想thinkpad笔记本bios设置usb启动教程-系统城...
  14. matlab锂电池充电电路,锂离子电池充放电电路模型及其仿真.doc
  15. IM即时通讯综合消息系统的架构
  16. 每日一个小技巧:1招教你提取伴奏怎么做
  17. CSS中定位属性的常见属性值
  18. TCP/IP回顾nbsp;nbsp;nbsp;TCP/UCP区别
  19. SSM整合版本一之普通的CRUD
  20. 【算法专题】环状图(置换群)

热门文章

  1. AE(自动编码器)与VAE(变分自动编码器)的区别和联系?
  2. C语言实现简单解释器(interpreter)
  3. go 自动文档生成 如何写高大上的 godoc(Go 文档)
  4. Ubuntu18.04安装之后的配置
  5. 蓝桥杯python:美丽的2
  6. Windows Server 2003防木马权限设置
  7. sqlserver2014补丁速度慢_SQL Server数据库查询速度慢的原因和解决方法
  8. python爬虫五大解析器
  9. 程序员该如何爱惜身体?
  10. [宏]_IO, _IOR, _IOW, _IOWR 宏的用法与解析