加载中...

文章背景图

给自己造个轮子:一个可配置的周期性桌面提醒工具

2026-01-28
34
-
- 分钟

前言

在日常工作或者娱乐中,长时间的专注容易让人忽略休息。虽然市面上提醒工具众多,但总想自己动手实现一个更贴合个人工作流的。于是,我用C#和WinForm写了一个轻量级的周期性提醒工具,核心需求是:能在自定义的时间段内,按设定的间隔播放提示音,并且能安静地待在系统托盘。

这个小项目麻雀虽小,五脏俱全,涉及了WinForm开发的多个基础但实用的知识点。

一、 核心功能与技术实现

  1. 自定义周期与时段

    • 功能:允许用户设置提醒间隔(分钟)和生效的起止时间(如 09:00-18:00)。程序只在设定时段内工作。

    • 实现:使用 NumericUpDownDateTimePicker控件获取输入。通过 System.Windows.Forms.Timer作为“心脏”,每隔数秒(例如5秒)检查一次当前时间。若当前时间在设定区间内,则累计时间差,达到设定的“间隔分钟数”后触发提醒。

  2. 嵌入式音频播放

    • 功能:播放内置的提示音,无需依赖外部音频文件,实现绿色单文件运行。

    • 实现

      1. .wav文件添加到项目资源中,并将其“生成操作”属性设置为“嵌入的资源”。

      2. 在代码中,通过 Assembly.GetExecutingAssembly().GetManifestResourceStream("命名空间.资源文件名.wav")获取音频流。

      3. 使用 System.Media.SoundPlayer类加载并播放该流。

  3. 配置持久化

    • 功能:退出程序时自动保存用户的间隔、起止时间设置,下次启动时自动载入,无需重复设置。

    • 实现:利用 System.Configuration.ConfigurationManager读写程序的配置文件(App.config)。将用户设置保存在 <appSettings>节点中,启动时读取,关闭时写入。

  4. 系统托盘与后台运行

    • 功能:主窗体可最小化到系统托盘,通过托盘图标右键菜单控制显示和退出,实现无干扰的后台运行。

    • 实现

      • 添加 NotifyIcon控件,设置其 IconContextMenuStrip(右键菜单)。

      • 监听主窗体的 Resize事件,当状态变为最小化时,隐藏主窗体并显示托盘图标。

      • 在托盘图标的鼠标双击或右键菜单事件中,实现显示主窗体和退出的逻辑。

  5. 便捷的窗体拖动

    • 功能:在窗体的空白区域(如标签或面板上)按住鼠标即可拖动整个窗口,提升UI体验。

    • 实现:在用作拖拽区的控件上(如一个LabelPanel)监听 MouseDown, MouseMove, MouseUp事件。在MouseDown时记录鼠标初始位置,在MouseMove时根据鼠标偏移量更新窗体的 Location属性。

二、 项目结构浅析

  • 开发环境:Visual Studio 2026, .NET Framework 4.8

  • 主窗体(MainForm)

    • 包含所有输入控件、开始/停止按钮。

    • 承载主要的 Timer计时逻辑和状态判断逻辑。

  • 程序设置类(AppSettings)

    • 一个简单的类,用于封装间隔、开始时间、结束时间等属性。

    • 包含 Load()Save()方法,分别调用 ConfigurationManager来与应用配置文件交互。

三、 开发小结与源码

这个工具虽然功能简单,但完整地串联了一个桌面应用从UI交互、业务逻辑、数据持久化到系统集成的常见流程。它非常适合作为WinForm初学者的一个综合练手项目,涵盖了:

  • 基础控件的事件处理

  • Timer的运用

  • 应用程序配置的读写

  • NotifyIcon(系统托盘)的使用

  • 窗体的自定义交互(拖动)

源码地址(还在完善中,后续会发布Github开源)

四、 可能的优化方向

工具目前已满足我的核心需求。如果未来需要增强,可能会考虑:

  1. 多音频/格式支持:允许用户选择外部音频文件,或支持更多音频格式。

  2. 更复杂的规则:区分工作日与周末,设置不同的提醒策略。

  3. 简易日志:在界面一角或日志文件中记录每次提醒触发的时间。

自己动手,解决一个具体的小问题,往往是最好的学习方式。如果你也有类似的需求,或者正在学习C#桌面开发,不妨也试着“造”一个属于自己的轮子。

评论交流

文章目录