基于C#制作一个休息提醒闹钟的详细步骤
作者:摔跤猫子 发布时间:2022-01-23 06:14:38
标签:c#,闹钟,休息提醒
> 此文主要通过WinForm来制作一个休息提醒闹钟,通过设置时间间隔进行提醒,避免沉浸式的投入到工作或者学习当中,战斗的同时也要照顾好自己。
实现流程
1.1、创建项目
打开Visual Studio,右侧选择创建新项目。
搜索框输入winform,选择windows窗体应用,填写对应的保存路径点击下一步,创建成功后如下图,会有一个默认打开的Form窗体。
1.2、时间间隔配置页
准备闹钟图片素材,修改窗体图标及标题样式。
通过设置窗体Text以及Icon等属性进行配置,同时配置StartPosition属性值为CenterScreen,让窗体默认居中显示。
在左侧工具箱拖拽Label、Buttom、NumericUpDown、timer等控件,实现页面大致布局。
双击窗体,进入代码界面,在顶部定义一个计数器字段。
private int MinCounter = 0;
在窗体编辑界面上双击启动按钮,生成对应的点击事件代码。
在启动按钮点击事件中增加业务逻辑代码如下:还原计数器为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;
}
在窗体编辑页单击timer控件,双击Tick,进入到对应的代码中。(Tick指每当经过指定的时间间隔时发生的事件)
private void timer1_Tick(object sender, EventArgs e)
{
}
在事件中首先获取窗体NumericUupDowm控件的值,就是用户所输入的分钟数。
int min = tbMin.Value;
业务代码:如果计数器等于用户所输入的分钟数,则跳转提示窗体并禁用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、闹钟提醒页
选中项目新建一个窗体,名字自定义,按上述步骤修改窗体标题及图标属性;随后在工具箱拖拽三个label标签到窗体上,分别用于图片、提示文字、倒计时等显示
准备一个素材图,并通过其中一个label控件的image属性进行导入,然后修改AutoSize属性值为False。
在提示窗体中定义几个字段,分别用于控制窗体关闭倒计时、显示已工作时长等作用。
private static int CLOSE_SEC = 300;
private string STR_MIN = "";
private int RUN_SEC = 0;
在窗体事件中接收传递过来的参数,并进行显示。
public TipForm(string _min)
{
STR_MIN = _min;
InitializeComponent();
}
窗体加载事件中设置label2的Text属性为提示信息。
label2.Text = "亲,您又工作了"+ STR_MIN + "分钟,该休息一下啦!";
在工具箱拖拽一个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) + "秒后自动关闭]";
}
}
可以再进行优化,窗体加载时通过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、开机自启动配置
回到Form1窗体,在工具箱拖拽出一个checkBox控件,用于勾选是否开启自启。
实现一个函数,设置应用程序开机自动运行。
/// <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;
}
双击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、日志记录
在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();
}
}
在窗体事件中调用上述函数。
在项目文件夹-> bin文件夹 -> Debug文件夹查看日志。
1.6、最小化提示
通过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(); //隐藏窗口
}
}
来源:https://blog.csdn.net/weixin_42794881/article/details/128741732


猜你喜欢
- java.sql.Timestamp(时间戳)继承父类:java.util.Date所有已实现的接口:Serializable, Clone
- 网络唤醒实现了对网络的集中管理,即在任何时刻,网管中心的IT管理人员可以经由网络远程唤醒一台处于休眠或关机状态的计算机。使用这一功能,IT管
- 测试参数设置:1、循环调用new A()实现堆溢出,java.lang.OutOfMemoryError: Java heap space,
- 本文实例分析了C#双缓冲技术。分享给大家供大家参考,具体如下:双缓冲解决闪烁问题。整理:GDI+的双缓冲问题一直以来的误区:.net1.1
- 本文实例为大家分享了SpringMVC实现文件上传与下载的具体代码,供大家参考,具体内容如下0.环境准备1.maven依赖<depen
- 微信公众号开发之回复图文消息,供大家参考,具体内容如下图文消息的主要参数说明通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图
- package com.huateng.readcsv;import java.io.BufferedReader;import java.
- 1 异常异常的体系• ThrowableError通常出现重大问题如:运行的类不存在或者内存溢出等。不编写针对代码对其处理Exception
- 本文实例为大家分享了unity实现鼠标跟随的具体代码,供大家参考,具体内容如下需求:当鼠标放到cube上,然后移开鼠标cube会跟随鼠标移动
- 前言最近接到个需求,不使用第三方SDK的情况下实现IM通讯,文字聊天已经通过MQTT实现,而语音功能目前想到的较好解决方案就是进行录音文件的
- 前言使用输入框时产品常常会有一些需求,比如123456789变成123-456-789或者限制一些字符的输入等等。很多时候都是网上搜索就完事
- 环境说明:Android Studio 2.0V7包版本:com.android.support:appcompat-v7:23.4.0co
- 本文实例讲述了Java类加载器和类加载机制。分享给大家供大家参考,具体如下:一 点睛1 类加载器负责将.class文件(可能在磁盘上,也可能
- 废话不多说了,直接给大家贴java代码了。 import java.io.IOException;import sun.net.Telnet
- gateway、webflux、reactor-netty请求日志输出场景在使用spring cloud gateway时想要输出请求日志,
- 深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象
- 前言这几天在做一个小工具app,结果在fragment里面动态申请权限提示原有的申请方法已经弃用,还画了很明显的删除线。。。这叫一个强迫症的
- 本文实例讲述了Android中SeekBar和RatingBar用法。分享给大家供大家参考,具体如下:什么是SeekBar?可以拖动的进度条
- try &
- 一、实现方式@ConfigurationProperties 注解(最好加上前缀prefix=“person”,标明是和配置文件中哪个开头的