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


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

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

    下面先看看运行效果:

    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 = 2;
    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             2
    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             -1
    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 = 50 * 60 * 1000; //ms(分钟*60秒*1000毫秒)
    23             this.TipsTime = 5;  //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 >= 0; 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(1000);
    65                 }
    66                 
    67                 //第三次使用委托,显示器熄灭,挂起线程3秒,用于缓冲,并且使密码框获得焦点,以便快速输入密码
    68                 actionDelegate = (x) =>
    69                 {
    70                     MonitorHelper.PowerOff(this.Handle);
    71                     Thread.Sleep(3000);
    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的简洁了许多。

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

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

  • 相关阅读:
    go 基础(二)
    go 基础(一)
    小程序生成带有多参数的太阳码
    php 3.2 生成压缩文件,并下载
    layer confirm 三种选择按钮
    无限级分类,抓取某元素的所有下级id
    bootstrap 自带字体颜色
    ajaxSubmit 页面生成的html 中含有表单提交表单方式
    php 保留2位小数
    日期范围
  • 原文地址:https://www.cnblogs.com/chenyucong/p/6020680.html
Copyright © 2020-2023  润新知