xRemindService
一个可以自定义提醒标题、内容、时间的项目。
因为想每个小时提醒自己喝水就写了一个项目来搞这个。
开发
需求
- 可以在
windows
界面弹窗 - 自定义提醒时间、内容和标题
- 重复打开时提示
难点
没有调用windowsAPI
的经验
实现
弹窗及隐藏控制台
因为没有调用windowsAPI
的经验,所以开始bing
查询如何调用 windowsAPI
才能弹出窗口。
- 弹窗
- 通过
kernel32.dll
的WTSGetActiveConsoleSessionId
来获取当前显示的桌面所在的SessionID
- 通过
wtsapi32.dll
的WTSSendMessage
来让 Session 弹出对话框
- 通过
- 隐藏控制台
- 通过
kernel32.dll
的GetConsoleWindow
来检索与调用进程关联的控制台使用的窗口句柄 - 通过
user32.dll
的ShowWindow
来控制窗口打状态
- 通过
1 | public static class Interop |
定时 Job
使用了以前用过的Quartz
,简单说一下就是新建 Job,定义触发器,放入调度器,等待任务执行就好了。需要注意的点是在定义 Job 的时候给需要执行的 Job 传参。使用了 JobDataMap.Put
来实现。具体配置在下面。
读取配置文件
因为可能配置多个 Job 所以在appsettings.json
中定义了一个CronJob
的属性,下面包含多个子 Job。子 Job 中包含三个属性Title
、CronScheduler
、RemindString
这样就能实现我的要求了。
通过使用IConfiguration
来获取appsettings.json
的属性和值。
1 | var jobs = _configuration.GetSection(Constants.CronJob).GetChildren(); |
防多开
使用 System.Threading.Mutex 来实现。实现代码如下
Mutex(Boolean, String, Boolean)
使用可指示调用线程是否应具有互斥体的初始所有权以及字符串是否为互斥体的名称的 Boolean 值和当线程返回时可指示调用线程是否已赋予互斥体的初始所有权的 Boolean 值初始化 Mutex 类的新实例。
官网
参数
initiallyOwned
Boolean
如果为 true,则给予调用线程已命名的系统互斥体的初始所属权(如果已命名的系统互斥体是通过此调用创建的);否则为 false。
name
String
如果要与其他进程共享同步对象,则为名称;否则为 null 或空字符串。 该名称区分大小写。
createdNew
Boolean
在此方法返回时,如果创建了局部互斥体(即,如果 name 为 null 或空字符串)或指定的命名系统互斥体,则包含布尔值 true;如果指定的命名系统互斥体已存在,则为 false。 此参数未经初始化即被传递。
1 | public static void Main(string[] args) |
使用说明
在appsettings.json
中含有默认的提醒,可以随意添加
1 | "CronJob": { |
RelaxJob
是 Job 名称可随意定义,包含三个属性Title
、CronScheduler
、RemindString
Title
是提醒标题 必填CronScheduler
是提醒时间 Cron 表达式 必填RemindString
是提醒内容 必填
安装
可以安装成服务这样不用每天都启动项目了
- 项目发布
- 我选择的是
- 配置:Release|Any CPU
- 目标框架:net5.0
- 部署模式:独立
- 目标运行时:win-x64
- 文件发布选项:勾选
生成单个文件
- 本人提供一个简单的安装方式
- 在发布目录下新建两个 bat 文件,一个
setup.bat
一个unsetup.bat
内容如下:setup.bat
1
2
3
4
5
6
7@echo off
set path=%~dp0
echo %path%
sc.exe create xRemindService binPath=%path%xRemindService.exe displayname= xRemindService
net start xRemindService
sc.exe config xRemindService start= AUTO
pauseunsetup.bat
1
2
3
4@echo off
sc.exe stop xRemindService
sc.exe delete xRemindService
pause
- 通过管理员运行
setup.bat
进行安装服务,unsetup.bat
进行卸载服务 - 如果修改配置文件需要重启服务
- 在发布目录下新建两个 bat 文件,一个
项目地址
https://github.com/KanekiQAQ/xRemindService
TO DO
- 新增 Web 添加 Job (替代原有
appsettings.json
的配置) 不一定做不做