最近发现日常的工作中,经常因为敲代码而忘记了休息,晚上眼睛特别的累。

并且经常长时间看着显示器,对眼睛一定是不好的,所以今天开发了一个小程序,用于提醒休息。

下面先看看运行效果:

1、程序启动后,后台运行,不显示界面,也没有制作显示托盘图标

2、当时间到达后,屏幕居中显示以下界面,并且开始倒计时

3、倒计时为0时,屏幕熄灭,但其实随便碰一下鼠标或键盘就会点亮显示器了。

4、人手点亮显示器后,显示以下界面,也可以不亮屏的状态下直接输入密码。

5、输入密码并且正确,界面隐藏至后台,并且重新计时。

上代码:

首先,要有一个控制显示器的帮助类,MonitorHelper

  1. using System;
  2. using System.Runtime.InteropServices;
  3.  
  4. namespace MonitorTool
  5. {
  6. /// <summary>
  7. /// 显示器开关控制
  8. /// </summary>
  9. public class MonitorHelper
  10. {
  11. [DllImport("user32.dll")]
  12. public static extern IntPtr SendMessage(
  13. IntPtr hWnd,
  14. uint msg,
  15. uint wParam,
  16. int lParam);
  17.  
  18. //系统消息
  19. private const uint WM_SYSCOMMAND = 0x112;
  20.  
  21. //关闭显示器的系统命令
  22. private const int SC_MONITORPOWER = 0xF170;
  23.  
  24. //2为PowerOff, 1为省电状态,-1为开机
  25. private const int MonitorPowerOff = ;
  26.  
  27. /// <summary>
  28. /// 关闭显示器
  29. /// </summary>
  30. public static void PowerOff(IntPtr hWnd)
  31. {
  32. SendMessage(
  33. hWnd,
  34. WM_SYSCOMMAND,
  35. SC_MONITORPOWER,
  36.  
  37. );
  38. }
  39.  
  40. /// <summary>
  41. /// 打开显示器
  42. /// </summary>
  43. public static void PowerOn(IntPtr hWnd)
  44. {
  45. SendMessage(
  46. hWnd,
  47. WM_SYSCOMMAND,
  48. SC_MONITORPOWER,
  49. -
  50. );
  51. }
  52. }
  53. }

程序界面:

只有2个控件,分别是Label控件,ID是"lblTips",TextBox控件,ID是"txtPwd"

窗体的TopMost设置为True,StartPosition设置为CenterScreen

窗体的后台代码:

  1. using System;
  2. using System.Threading;
  3. using System.Windows.Forms;
  4.  
  5. namespace MonitorTool
  6. {
  7. public partial class FrmMain : Form
  8. {
  9. //工作总时间
  10. public int WorkTime { get; set; }
  11. //显示器关闭前的倒计时时间
  12. public int TipsTime { get; set; }
  13.  
  14. public string Password { get; set; }
  15. //线程变量
  16. public Thread tTotal { get; set; }
  17.  
  18. public FrmMain()
  19. {
  20. InitializeComponent();
  21. //初始化变量值,也是方便以后修改
  22. this.WorkTime = * * ; //ms(分钟*60秒*1000毫秒)
  23. this.TipsTime = ; //s(倒计时的总秒数)
  24. this.Password = "cong"; //重新计时的密码
  25. }
  26.  
  27. private void FrmMain_Load(object sender, EventArgs e)
  28. {
  29. TimerTotal();
  30.  
  31. //隐藏窗口
  32. this.ShowInTaskbar = false;
  33. this.Hide();
  34. }
  35.  
  36. //开始计时,至屏幕熄灭的方法
  37. public void TimerTotal()
  38. {
  39. //打开新的线程
  40. tTotal = new Thread(() =>
  41. {
  42. //挂起线程,直到到达工作总时间
  43. Thread.Sleep(this.WorkTime);
  44.  
  45. //声明系统的委托
  46. Action<string> actionDelegate = null;
  47.  
  48. //第一次使用委托,显示窗口
  49. actionDelegate = (x) =>
  50. {
  51. lblTips.Text = "";
  52. this.Show();
  53. };
  54. this.Invoke(actionDelegate, "show");
  55.  
  56. //第二次使用委托,for循环,显示倒计时提示信息,每个循环挂起线程1秒
  57. for (int i = this.TipsTime; i >= ; i--)
  58. {
  59. actionDelegate = (x) =>
  60. {
  61. lblTips.Text = string.Format("Monitor will turn off after {0} secords ...", x);
  62. };
  63. this.lblTips.Invoke(actionDelegate, i.ToString());
  64. Thread.Sleep();
  65. }
  66.  
  67. //第三次使用委托,显示器熄灭,挂起线程3秒,用于缓冲,并且使密码框获得焦点,以便快速输入密码
  68. actionDelegate = (x) =>
  69. {
  70. MonitorHelper.PowerOff(this.Handle);
  71. Thread.Sleep();
  72. lblTips.Text = "please type your password.";
  73. txtPwd.Focus();
  74. };
  75. this.Invoke(actionDelegate, "hide");
  76. });
  77.  
  78. //运行线程前,必须定义为后台运行,并开启线程
  79. tTotal.IsBackground = true;
  80. tTotal.Start();
  81. }
  82.  
  83. //密码框,如果密码正确,则再次开启线程,重新计时
  84. private void txtPwd_TextChanged(object sender, EventArgs e)
  85. {
  86. if (txtPwd.Text.Trim().Equals(this.Password))
  87. {
  88. txtPwd.Text = "";
  89.  
  90. TimerTotal();
  91. this.Hide();
  92. }
  93. }
  94. }
  95. }

这样就可以完成了。

其实也可以使用Timer控件来制作,但是因为不大熟练线程的使用,所以特意使用线程。

当然,这只用到了线程中很少一部分的知识,代码比使用Timer的简洁了许多。

最后,把程序添加到系统的启动文件夹内,以后开机就能自动运行了。

当看到倒计时的时候,应该要停下工作,起来活动活动了。

C# winform线程的使用 制作提醒休息小程序(长时间计算机工作者必备)的更多相关文章

  1. 算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!

    算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!

  2. 教你制作挂件头像 | 小程序七十二变之 canvas 绘制国旗头像

    昨天朋友圈被「请给我一面国旗@微信官方」刷屏,虽然知道是假的,但是从另一个角度来看,弄清楚如何实现更有趣. 1.canvas 这就不得不提到小程序中的 API canvas,H5 中也是有 canva ...

  3. WPF控件--利用Winform库中的NotifyIcon实现托盘小程序

    WPF控件--NotifyIcon   运行界面如下所示:            图1                                             图2 代码很少,如下所示 ...

  4. 利用Python制作简单的小程序:IP查看器

    前言 说实话,查看电脑的IP,也挺无聊的,但是够简单,所以就从这里开始吧.IP地址在操作系统里就可以直接查看.但是除了IP地址,我们也想通过IP获取地理地址和网络运营商情况.IP地址和地理地址并没有固 ...

  5. 制作一个控制台小程序,要求:用户可以在控制到录入学生的姓名,当用户输入quit(不区分大小写)时,程序停止接收用户输入,并且显示出学生个数及姓名

    string name = string.Empty; //定义一个集合来接收学生 List<string> my = new List<string>(); do { Con ...

  6. JavaScript中的setTimeout、setInterval和随机函数制作简易抽奖小程序

    几乎所有计算机语言有都内置随机函数.当然这种随机,人们习惯称为伪随机数发生器,产生的是一个[0,1)之间的一个小数.再通过简单算术运算生成一个符合需求的整数.JS中通用公式通常为parseInt(Ma ...

  7. 微信小程序如何开发制作

    微信小程序如何开发制作 微容SMO是一款微信小程序的免费在线制作工具,用户在微容平台上无需编辑代码,可通过拖拽式操作即可完成小程序的制作,真正意义上实现了小程序零代码免费制作! 消除技术门槛:无需代码 ...

  8. 理解微信小程序的双线程模型

    有过微信小程序开发经验的朋友应该都知道"双线程模型"这个概念,本文简单梳理一下双线程模型的一些科普知识,学识浅薄,若有错误欢迎指正. 我以前就职于「小程序·云开发」团队,在对外的一 ...

  9. [Deepin 15] 安装 Java 8、Git、Firefox、SafeEyes(定时提醒休息工具)

    一.安装 JDK 8 1.到官网,用 迅雷下载 安装包 (jdk-8u131-linux-x64.tar.gz) 2.解压放到目录 /opt/software/jdk 3.配置环境变量 sudo vi ...

随机推荐

  1. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  2. 【Xamarin挖墙脚系列:在VMware11中安装Mac10.11 EI Captain后的vmware tools】

    原文:[Xamarin挖墙脚系列:在VMware11中安装Mac10.11 EI Captain后的vmware tools] 如何安装 darwin.iso,百度去吧. 关键是对应版本的darwin ...

  3. 检查string是否为double

    之前写的方法,使用try catch来处理 如果能捕获异常就说明问题 public bool CheckLegal() { double number; bool flag = true; try { ...

  4. BZOJ2105: 增强型LCP

    2105: 增强型LCP Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 366  Solved: 86[Submit][Status] Descrip ...

  5. 如何扩展大规模Web网站的性能?

    Reduce Data广告服务网站如何扩展到每天300K QPS请求?分享经验如下: 1. 为大规模设计,广告服务平台从一开始增长就很惊人,因此,系统开始就为大规模设计,系统为水平和垂直伸缩扩展. 2 ...

  6. 奇怪的Lisp和难懂的计算机程序的构造和解释

    最近用新买的 Kindle 看<黑客与画家>的Lisp部分,发现作者 Paul Graham 很推崇 Lisp 语言,并且认为其它语言都没有Lisp简洁“成熟”,并且举例证明其它语言都在往 ...

  7. [Boost]图形处理库Boost::Polygon

    Background 工作中经师傅指导学习应用到了Boost::Polygon这个库,相对于Boost::Geometry,Polygon出自Intel.抽象于芯片流程,于是更贴近于芯片设计流程应用. ...

  8. Tsinsen A1504. Book(王迪) 数论,贪心

    题目:http://www.tsinsen.com/A1504 A1504. Book(王迪) 时间限制:1.0s   内存限制:256.0MB   Special Judge 总提交次数:359   ...

  9. php连接mysql数据库练手

    <?php $servername = "localhost"; $username = "yosha"; $password = "leon0 ...

  10. What does wildcard address in InetSocketAddress mean?

    In the docs for the constructor InetSocketAddress(int port) it says: Creates a socket address where ...