基于C#制作一个休息提醒闹钟

news2024/10/5 19:18:46
> 此文主要通过WinForm来制作一个休息提醒闹钟,通过设置时间间隔进行提醒,避免沉浸式的投入到工作或者学习当中,战斗的同时也要照顾好自己。

    • 实现流程
      • 1.1、创建项目
      • 1.2、时间间隔配置页
      • 1.3、闹钟提醒页
      • 1.4、开机自启动配置
      • 1.5、日志记录
      • 1.6、最小化提示

实现流程

1.1、创建项目

  1. 打开Visual Studio,右侧选择创建新项目。

在这里插入图片描述

  1. 搜索框输入winform,选择windows窗体应用,填写对应的保存路径点击下一步,创建成功后如下图,会有一个默认打开的Form窗体。

在这里插入图片描述
在这里插入图片描述

1.2、时间间隔配置页

  1. 准备闹钟图片素材,修改窗体图标及标题样式。
  1. 通过设置窗体Text以及Icon等属性进行配置,同时配置StartPosition属性值为CenterScreen,让窗体默认居中显示。

在这里插入图片描述

  1. 在左侧工具箱拖拽Label、Buttom、NumericUpDown、timer等控件,实现页面大致布局。
  1. 双击窗体,进入代码界面,在顶部定义一个计数器字段。

在这里插入图片描述

private int MinCounter = 0;
  1. 在窗体编辑界面上双击启动按钮,生成对应的点击事件代码。

在这里插入图片描述
在这里插入图片描述

  1. 在启动按钮点击事件中增加业务逻辑代码如下:还原计数器为0、禁用启动按钮、释放停止按钮、启动定时器。

在这里插入图片描述

/// <summary>
/// 启动按钮点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
    MinCounter = 0;
    btnStart.Enabled = false;
    btnEnd.Enabled = true;
    timer1.Enabled = true;
}
  1. 在窗体编辑页单击timer控件,双击Tick,进入到对应的代码中。(Tick指每当经过指定的时间间隔时发生的事件)

在这里插入图片描述
在这里插入图片描述

private void timer1_Tick(object sender, EventArgs e)
{
  
}
  1. 在事件中首先获取窗体NumericUupDowm控件的值,就是用户所输入的分钟数。

在这里插入图片描述

int min = tbMin.Value;
  1. 业务代码:如果计数器等于用户所输入的分钟数,则跳转提示窗体并禁用timer控件,否则计数器的值+1。

在这里插入图片描述

  private void timer1_Tick(object sender, EventArgs e)
  {
        if (MinCounter == tbMin.Value)
        {
            timer1.Enabled = false;
            using (message msg = new message(tbMin.Value.ToString()))
            {
                tip.ShowDialog();
            }
            MinCounter = 0;
            timer1.Enabled = true;
        }
        else
        {
            MinCounter++;
        }
    }

1.3、闹钟提醒页

  1. 选中项目新建一个窗体,名字自定义,按上述步骤修改窗体标题及图标属性;随后在工具箱拖拽三个label标签到窗体上,分别用于图片、提示文字、倒计时等显示

在这里插入图片描述

  1. 准备一个素材图,并通过其中一个label控件的image属性进行导入,然后修改AutoSize属性值为False。

在这里插入图片描述
在这里插入图片描述

  1. 在提示窗体中定义几个字段,分别用于控制窗体关闭倒计时、显示已工作时长等作用。

在这里插入图片描述

private static int CLOSE_SEC = 300;
private string STR_MIN = "";
private int RUN_SEC = 0;
  1. 在窗体事件中接收传递过来的参数,并进行显示。

在这里插入图片描述

 public TipForm(string _min)
 {
     STR_MIN = _min;
     InitializeComponent();
 }
  1. 窗体加载事件中设置label2的Text属性为提示信息。

在这里插入图片描述

label2.Text = "亲,您又工作了"+ STR_MIN + "分钟,该休息一下啦!";
  1. 在工具箱拖拽一个timer控件到窗体上,通过其Tick属性设置倒计时秒数显示及窗体关闭事件。

在这里插入图片描述
在这里插入图片描述

 private void timer1_Tick(object sender, EventArgs e)
 {
     RUN_SEC++;
     if (RUN_SEC >= CLOSE_SEC)
     {
         RUN_SEC = 0;
         Close();
     } else
     {
         label2.Text = "[" + (CLOSE_SEC - RUN_SEC) + "秒后自动关闭]";
     }
 }
  1. 可以再进行优化,窗体加载时通过Player播放铃声同步提醒。

在这里插入图片描述

 	//播放声音
	string wavFile = Application.StartupPath + @"\alarm.wav";
	Stream sm = null;
	if (File.Exists(wavFile))
	{
	sm = new FileStream(wavFile, FileMode.Open);
	} else
	{
	sm = Properties.Resources.Alarm02;
	}
	SoundPlayer player = new SoundPlayer(sm);
	player.Play();
	player.Dispose();

1.4、开机自启动配置

  1. 回到Form1窗体,在工具箱拖拽出一个checkBox控件,用于勾选是否开启自启。

在这里插入图片描述

  1. 实现一个函数,设置应用程序开机自动运行。

在这里插入图片描述

 		/// <summary>
        /// 设置应用程序开机自动运行
        /// </summary>
        /// <param name="fileName">应用程序的文件名</param>
        /// <param name="isAutoRun">是否自动运行,为false时,取消自动运行</param>
        /// <returns>返回1成功,非1不成功</returns>
        public static String SetAutoRunByReg(string fileName, bool isAutoRun)
        {
            string reSet = string.Empty;
            RegistryKey reg = null;
            try
            {
                if (!File.Exists(fileName))
                {
                    reSet = "设置/取消自动启动发生异常:" + fileName + "文件不存在!";
                }
                string key = @"Software\Microsoft\Windows\CurrentVersion\Run";
                string name = Path.GetFileName(fileName);
                reg = Registry.LocalMachine.OpenSubKey(key, true);
                if (reg == null)
                {
                    reg = Registry.LocalMachine.CreateSubKey(key);
                }
                if (isAutoRun)
                {
                    reg.SetValue(name, fileName);
                    reSet = "1";
                }
                else
                {
                    if (reg.GetValue(name) != null)
                    {
                        reg.DeleteValue(name);
                    }
                    reSet = "1";
                }

            }
            catch (Exception ex)
            {
                reSet = "设置/取消自动启动发生异常:[" + ex.Message + "],请尝试用管理员身份运行!";
            }
            finally
            {
                if (reg != null)
                {
                    reg.Close();
                }
            }
            return reSet;
        }

  1. 双击checkbox的click事件生成对应的事件代码,调用上述函数即可实现开机自启效果。

在这里插入图片描述

 //开机自动启动并最小化
 private void chkBoxBoot_Click(object sender, EventArgs e)
 {
     string res = SetAutoRunByReg(Application.ExecutablePath, chkBoxBoot.Checked);
     if (res != "1")
     {
         MessageBox.Show(res);
     }
 }

1.5、日志记录

  1. 在Form1窗体定义一个函数记录启动以及操作日志并存入文本。

在这里插入图片描述

 /// <summary>
        /// 写日志
        /// </summary>
        /// <param name="msg">日志文本</param>
        /// <param name="add_datetime">是否添加时间戳</param>
        public static void writeLog(string msg, bool add_datetime)
        {
            string logfile = Application.StartupPath + "/log.txt";
            using (StreamWriter w = File.AppendText(logfile))
            {
                if (add_datetime)
                {
                    w.WriteLine("{0}\t {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss", DateTimeFormatInfo.InvariantInfo), msg);
                }
                else
                {
                    w.WriteLine("{0}", msg);
                }

                w.Flush();
                w.Close();
            }
        }
  1. 在窗体事件中调用上述函数。

在这里插入图片描述

  1. 在项目文件夹-> bin文件夹 -> Debug文件夹查看日志。

在这里插入图片描述
在这里插入图片描述

1.6、最小化提示

  1. 通过Form1的Closing、Resize等属性进行配置,实现windows提示效果。

在这里插入图片描述
在这里插入图片描述

  private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //注意判断关闭事件Reason来源于窗体按钮,否则用菜单退出时无法退出!
            if (e.CloseReason == CloseReason.UserClosing)
            {
                e.Cancel = true;    //取消"关闭窗口"事件
                this.WindowState = FormWindowState.Minimized;    //使关闭时窗口向右下角缩小的效果
                notifyIcon1.Visible = true;
                notifyIcon1.ShowBalloonTip(3000, "提示", "程序未退出,它在这里!", ToolTipIcon.Info);
                this.Hide();
                return;
            }
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState == FormWindowState.Minimized)    //最小化到系统托盘
            {
                notifyIcon1.Visible = true;    //显示托盘图标
                notifyIcon1.ShowBalloonTip(3000, "提示", "程序未退出,它在这里!", ToolTipIcon.Info);
                this.Hide();    //隐藏窗口
            }
        }

明天就是除夕了,在这辞旧迎新的日子里,祝大家诸事顺遂,鹏程万里。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个数据库文档生成神器

Gitee项目地址&#xff0c;可以直接去开源项目查看&#xff08;推荐&#xff09; 简介 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出&#xff0c;从业以来&#xff0c;待过几家企业&#xff0c;关于数据库表结构文档状态&#xff1a;要么没有、要么有、但都是…

MySql 5.7.40备份到腾讯云cos+从cos恢复

1 备份 1.1 安装coscli # wget https://github.com/tencentyun/coscli/releases/download/v0.12.0-beta/coscli-linux # mv coscli-linux /usr/bin/coscli # chmod 755 /usr/bin/coscli # coscli --version如果github慢可以使用国内镜像&#xff1a; wget https://cosbrowse…

数电相关知识

文章目录 逻辑电路与或非异或 门电路与的物理电路电压比较器D型锁存器优先编码器边沿触发器RS触发器施密特触发器基本原理555定时器数电电平TTL器件CMOS器件逻辑电路 与或非异或 门电路 与乘大于1或加大于1异或异性为1,异吗? 与的物理电路

Leetcode:17. 电话号码的字母组合(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&…

【数据库】必须知道的MySQL优化

文章目录SQL语言有哪几部分组成为什么要进行MySQL优化&#xff1f;优化方法有哪些&#xff1f;SQL层面优化MySQL配置方面架构设计方面硬件和操作系统方面.SQL语言有哪几部分组成 数据定义语言&#xff0c;简称DDL&#xff1a;DROP,CREATE,ALTER等语句。数据操作语言&#xff0…

【Java|golang】2299. 强密码检验器 II

如果一个密码满足以下所有条件&#xff0c;我们称它是一个 强 密码&#xff1a; 它有至少 8 个字符。 至少包含 一个小写英文 字母。 至少包含 一个大写英文 字母。 至少包含 一个数字 。 至少包含 一个特殊字符 。特殊字符为&#xff1a;“!#$%^&*()-” 中的一个。 它 不…

VMware 安装 OpenWrt 旁路由并配置 PassWall

准备 OpenWrt 镜像包&#xff0c;本例使用的是在恩山论坛上面下载的https://www.right.com.cn/forum/thread-8271618-1-1.html网络选择 NAT 模式创建虚拟机一直下一步至一直下一步至&#xff0c;这里选择 NAT 方式一直下一步至&#xff0c;这里选择“使用现在虚拟磁盘”&#x…

高并发系统设计 -- 粉丝关注列表如何设计

粉丝关注列表如何设计和落地 业务场景 上图我们简称relation页。relation页展示用户的关系相关信息&#xff0c;包含两个子页面&#xff1a; follower页&#xff0c;展示关注该用户的所有用户信息。attention页&#xff0c;展示该用户关注的所有用户信息 主要操作 用户可以…

数论之欧拉筛法(含朴素筛选、埃式筛选详细代码)

文章目录前言朴素筛法&#xff08;纯暴力&#xff0c;O(n^2^)&#xff09;埃式筛法&#xff08;找出合数来确认质数, O(n*log(logn))&#xff09;欧拉筛法&#xff08;线性筛选&#xff0c;O(n)&#xff09;参考文章前言 在学习Acwing c蓝桥杯辅导课第八讲数论-1295. X的因子链…

Linux常用命令——tcpdump命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tcpdump 一款sniffer工具&#xff0c;是Linux上的抓包工具&#xff0c;嗅探器。 补充说明 tcpdump命令是一款抓包&#xff0c;嗅探器工具&#xff0c;它可以打印所有经过网络接口的数据包的头信息&#xff0c;…

【MySQL】CentOS7 卸载以及安装 MySQL 详细流程

一、卸载 MySQL 查看 MySQL 安装版本 mysqladmin --version通过 rpm 查找 MySQL rpm -qa|grep -i mysql查看 MySQL 运行状态 systemctl status mysqld.service关闭 MySQL 服务 systemctl stop mysqld.service通过 yum remove 删除 MySQL 安装包 把上面所有的安装包挨个删除…

用友U8和旺店通·企业奇门单据接口对接

对接系统旺店通企业奇门旺店通是北京掌上先机网络科技有限公司旗下品牌&#xff0c;国内的零售云服务提供商&#xff0c;基于云计算SaaS服务模式&#xff0c;以体系化解决方案&#xff0c;助力零售企业数字化智能化管理升级。为零售电商企业的订单管理及仓储管理提供解决方案&a…

Java寒假作业——编程题

二、编程题&#xff08;ACM模式&#xff09;1-2题1 &#xff08;2022蚂蚁金服&#xff09;一个字母可以拆分成两个字母表顺序的前一个字母&#xff0c;例如&#xff0c;b可以拆分成aa&#xff0c;c可以拆分成bb。打印出最短的可以拆分成 K 个 a 的字符串&#xff0c;字母顺序无…

Spring的三种装配机制(XML、JavaConfig、自动装配)

Spring中bean有三种装配机制一、在xml中显示装配二、 在java中显式装配&#xff0c;都需要在Config配置类重写三、自动装配1. xml方式自动装配2. 使用注解装配等于依赖关系注入&#xff0c;即一个Bean作为属性&#xff0c;装配到另一个Bean。 一、在xml中显示装配 <!--1. …

GCC是什么

GCC是什么 说到 GCC&#xff0c;就不得不提 GNU&#xff0c;“GNU”是“GNUs Not Unix!”&#xff08;GNU并非Unix&#xff01;&#xff09;的首字母递归缩写&#xff0c;中文名“革奴计划”。GNU 计划的最终目标是打造出一套完全自由&#xff08;即自由使用、自由更改、自由发…

Java基础之《netty(28)—TCP粘包拆包原理》

一、基本介绍 1、TCP是面向连接的&#xff0c;面向流的&#xff0c;提供高可靠性服务。收发两端&#xff08;客户端和服务器端&#xff09;都要有一一成对的socket&#xff0c;因此&#xff0c;发送端为了将多个发给接收端的包&#xff0c;更有效的发给对方&#xff0c;使用了…

C++语法复习笔记-第6章 c++指针

文章目录1. 计算机内存1. 储存层次2. 内存单元与地址3. 指针定义2. 左值与右值1. 数组与指针1. 概念3. C中的原始指针1. 数组指针与指针数组2. const pointer 与 pointer to const3. 指向指针的指针4.关于野指针4.1 指向指针的指针4.2 NULL指针4.3 野指针5. 指针的基本运算5.1 …

MySQL 批量插入

文章目录MySQL批量插入10w条数据创建表创建函数创建存储过程调用存储过程MySQL批量插入10w条数据 创建表 创建emp&#xff08;部门&#xff09;表 创建dept&#xff08;员工&#xff09;表 创建函数 创建rand_num函数&#xff0c;随机生成部门编号&#xff0c;保证部门编…

Spark RDD算子

文章目录Spark RDD算子一、RDD 转换算子1、Value 类型(1) mapSpark RDD算子 RDD 方法也叫做RDD算子&#xff0c;主要分为两类&#xff0c;第一类是用来做转换的&#xff0c;例如flatMap()&#xff0c;Map()方法&#xff0c;第二类是行动的&#xff0c;例如&#xff1a;collenc…

Spring Security in Action 第八章 配置授权:api授权

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;以实战为线索&#xff0c;逐步深入SpringSecurity相关知识相关知识&#xff0c;打造完整的SpringSecurity学习步骤&#xff0c;提升工程化编码能力和思维能力&#xff0c;写出高质量代码。希望大家都能够从中有所收获&#…