前言
在日常工作或者娱乐中,长时间的专注容易让人忽略休息。虽然市面上提醒工具众多,但总想自己动手实现一个更贴合个人工作流的。于是,我用C#和WinForm写了一个轻量级的周期性提醒工具,核心需求是:能在自定义的时间段内,按设定的间隔播放提示音,并且能安静地待在系统托盘。
这个小项目麻雀虽小,五脏俱全,涉及了WinForm开发的多个基础但实用的知识点。
一、 核心功能与技术实现
自定义周期与时段
功能:允许用户设置提醒间隔(分钟)和生效的起止时间(如 09:00-18:00)。程序只在设定时段内工作。
实现:使用
NumericUpDown和DateTimePicker控件获取输入。通过System.Windows.Forms.Timer作为“心脏”,每隔数秒(例如5秒)检查一次当前时间。若当前时间在设定区间内,则累计时间差,达到设定的“间隔分钟数”后触发提醒。
嵌入式音频播放
功能:播放内置的提示音,无需依赖外部音频文件,实现绿色单文件运行。
实现:
将
.wav文件添加到项目资源中,并将其“生成操作”属性设置为“嵌入的资源”。在代码中,通过
Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.资源文件名.wav")获取音频流。使用
System.Media.SoundPlayer类加载并播放该流。
配置持久化
功能:退出程序时自动保存用户的间隔、起止时间设置,下次启动时自动载入,无需重复设置。
实现:利用
System.Configuration.ConfigurationManager读写程序的配置文件(App.config)。将用户设置保存在<appSettings>节点中,启动时读取,关闭时写入。
系统托盘与后台运行
功能:主窗体可最小化到系统托盘,通过托盘图标右键菜单控制显示和退出,实现无干扰的后台运行。
实现:
添加
NotifyIcon控件,设置其Icon和ContextMenuStrip(右键菜单)。监听主窗体的
Resize事件,当状态变为最小化时,隐藏主窗体并显示托盘图标。在托盘图标的鼠标双击或右键菜单事件中,实现显示主窗体和退出的逻辑。
便捷的窗体拖动
功能:在窗体的空白区域(如标签或面板上)按住鼠标即可拖动整个窗口,提升UI体验。
实现:在用作拖拽区的控件上(如一个
Label或Panel)监听MouseDown,MouseMove,MouseUp事件。在MouseDown时记录鼠标初始位置,在MouseMove时根据鼠标偏移量更新窗体的Location属性。
二、 项目结构浅析
开发环境:Visual Studio 2026, .NET Framework 4.8
主窗体(MainForm):
包含所有输入控件、开始/停止按钮。
承载主要的
Timer计时逻辑和状态判断逻辑。
程序设置类(AppSettings):
一个简单的类,用于封装间隔、开始时间、结束时间等属性。
包含
Load()和Save()方法,分别调用ConfigurationManager来与应用配置文件交互。
三、 开发小结与源码
这个工具虽然功能简单,但完整地串联了一个桌面应用从UI交互、业务逻辑、数据持久化到系统集成的常见流程。它非常适合作为WinForm初学者的一个综合练手项目,涵盖了:
基础控件的事件处理
Timer的运用应用程序配置的读写
NotifyIcon(系统托盘)的使用窗体的自定义交互(拖动)
源码地址:
(还在完善中,后续会发布Github开源)
四、 可能的优化方向
工具目前已满足我的核心需求。如果未来需要增强,可能会考虑:
多音频/格式支持:允许用户选择外部音频文件,或支持更多音频格式。
更复杂的规则:区分工作日与周末,设置不同的提醒策略。
简易日志:在界面一角或日志文件中记录每次提醒触发的时间。
自己动手,解决一个具体的小问题,往往是最好的学习方式。如果你也有类似的需求,或者正在学习C#桌面开发,不妨也试着“造”一个属于自己的轮子。