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

时间:2024-05-31 19:03:56

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

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

下面先看看运行效果:

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

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

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

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

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

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

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

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

窗体的后台代码:

 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的简洁了许多。

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

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