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

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

下面先看看运行效果:

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

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

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

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

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

上代码:

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

 using System;
using System.Runtime.InteropServices; namespace MonitorTool
{
/// <summary>
/// 显示器开关控制
/// </summary>
public class MonitorHelper
{
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(
IntPtr hWnd,
uint msg,
uint wParam,
int lParam); //系统消息
private const uint WM_SYSCOMMAND = 0x112; //关闭显示器的系统命令
private const int SC_MONITORPOWER = 0xF170; //2为PowerOff, 1为省电状态,-1为开机
private const int MonitorPowerOff = ; /// <summary>
/// 关闭显示器
/// </summary>
public static void PowerOff(IntPtr hWnd)
{
SendMessage(
hWnd,
WM_SYSCOMMAND,
SC_MONITORPOWER, );
} /// <summary>
/// 打开显示器
/// </summary>
public static void PowerOn(IntPtr hWnd)
{
SendMessage(
hWnd,
WM_SYSCOMMAND,
SC_MONITORPOWER,
-
);
}
}
}

程序界面:

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

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

窗体的后台代码:

 using System;
using System.Threading;
using System.Windows.Forms; namespace MonitorTool
{
public partial class FrmMain : Form
{
//工作总时间
public int WorkTime { get; set; }
//显示器关闭前的倒计时时间
public int TipsTime { get; set; } public string Password { get; set; }
//线程变量
public Thread tTotal { get; set; } public FrmMain()
{
InitializeComponent();
//初始化变量值,也是方便以后修改
this.WorkTime = * * ; //ms(分钟*60秒*1000毫秒)
this.TipsTime = ; //s(倒计时的总秒数)
this.Password = "cong"; //重新计时的密码
} private void FrmMain_Load(object sender, EventArgs e)
{
TimerTotal(); //隐藏窗口
this.ShowInTaskbar = false;
this.Hide();
} //开始计时,至屏幕熄灭的方法
public void TimerTotal()
{
//打开新的线程
tTotal = new Thread(() =>
{
//挂起线程,直到到达工作总时间
Thread.Sleep(this.WorkTime); //声明系统的委托
Action<string> actionDelegate = null; //第一次使用委托,显示窗口
actionDelegate = (x) =>
{
lblTips.Text = "";
this.Show();
};
this.Invoke(actionDelegate, "show"); //第二次使用委托,for循环,显示倒计时提示信息,每个循环挂起线程1秒
for (int i = this.TipsTime; i >= ; i--)
{
actionDelegate = (x) =>
{
lblTips.Text = string.Format("Monitor will turn off after {0} secords ...", x);
};
this.lblTips.Invoke(actionDelegate, i.ToString());
Thread.Sleep();
} //第三次使用委托,显示器熄灭,挂起线程3秒,用于缓冲,并且使密码框获得焦点,以便快速输入密码
actionDelegate = (x) =>
{
MonitorHelper.PowerOff(this.Handle);
Thread.Sleep();
lblTips.Text = "please type your password.";
txtPwd.Focus();
};
this.Invoke(actionDelegate, "hide");
}); //运行线程前,必须定义为后台运行,并开启线程
tTotal.IsBackground = true;
tTotal.Start();
} //密码框,如果密码正确,则再次开启线程,重新计时
private void txtPwd_TextChanged(object sender, EventArgs e)
{
if (txtPwd.Text.Trim().Equals(this.Password))
{
txtPwd.Text = ""; TimerTotal();
this.Hide();
}
}
}
}

这样就可以完成了。

其实也可以使用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. 最好的程序员都是行动派(成功者不是那些明知赚钱之法还要推三阻四的人。成功者知道轻重缓急,善于把握今天) good

    我相信,所有程序员都需要在下面两点之间找到一个良好的平衡: 1.把自己关在一间私密的办公室里,针对你的程序与编译器展开一次亲密对话. 2.出入公众场合,与其他人公开谈论你的程序. 关于这个话题,我已经 ...

  2. Delphi xe10下载(包含破解补丁和破解视频)

    软件名称:RAD Studio 10 Seattle软件大小:7.18 GB RAD Studio 10 Seattle官方下载地址:http://altd.embarcadero.com/downl ...

  3. 安装Chive提示CDbConnection failed to open the DB connection.

    最近初学PHP,看到Chive这个好玩的数据库管理工具,在登录时遇到这样的错误提示信息: CDbConnection failed to open the DB connection. 我的PHP版本 ...

  4. 【HDOJ】3047 Zjnu Stadium

    带权并查集. /* 3047 */ #include <iostream> #include <string> #include <map> #include &l ...

  5. poj magic number

    Problem H Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  6. bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2277  Solved: 853[Submit][Stat ...

  7. JavaScript高级程序设计34.pdf

    元素大小 偏移量 offsetHeight:元素在垂直空间上占用的大小,以像素计.包括元素的高度.(可见的)水平滚动条的高度.上边框高度和下边框高度. offsetWidth:元素在水平空间上占用的大 ...

  8. js函数参数设置默认值

    php有个很方便的用法是在定义函数时可以直接给参数设默认值,如: function simue ($a=1,$b=2){  return $a+$b;}echo simue(); //输出3echo ...

  9. java解惑

    java对转义字符没有提供任何特殊处理.编译器在将程序解析成各种符号之前,先将 Unicode 转义字符转换成为它们所表示的字符[JLS 3.2] 阅读笔记

  10. oracle删除当前用户下所有表

    1.如果有删除用户的权限,则可以: drop user user_name cascade; 加了cascade就可以把用户连带的数据全部删掉. 删除后再创建该用户.--创建管理员用户create u ...