整点报时程序
在mac下使用整点报时程序,感觉不错,遂在windows下写了一个。
用Microsoft Speech API 实现的,其实很简单,下载sapi的sdk里面有例子可以参考。
不过为了写成一个系统服务,费了不少周折,最后发现如果系统服务使用System帐号,即便打开“允许服务与桌面交互”,也是不能发出声音的,遂放弃,直接写成启动加载的程序了。
上代码:
#include <windows.h>
#include <tchar.h>
#include <time.h>
#include <atlbase.h>
#include <sapi.h> //sapi.h在SDK的include目录
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "sapi.lib") //sapi.lib在SDK的lib目录VOID ReportClock(int nHour, INT nMinute);
VOID CheckTime(BOOL start = FALSE);INT APIENTRY WinMain(HINSTANCE, HINSTANCE, LPSTR, INT) {
// 启动报时
CheckTime(TRUE);
// 整点报时
while (TRUE) {
Sleep(1000);
CheckTime();
}
return 0;
}VOID ReportClock(INT nHour, INT nMinute) {
// COM初始化
if (FAILED(::CoInitialize(NULL))) {
return;
}
WCHAR szReport[200];
if (nMinute == 0) {
::wsprintfW(szReport, L"<VOICE REQUIRED='NAME=Microsoft Lili'/>现在时刻:%d 点整", nHour);
} else if (nMinute < 10) {
::wsprintfW(szReport, L"<VOICE REQUIRED='NAME=Microsoft Lili'/>现在时刻:%d 点 0%d 分", nHour, nMinute);
} else {
::wsprintfW(szReport, L"<VOICE REQUIRED='NAME=Microsoft Lili'/>现在时刻:%d 点 %d 分", nHour, nMinute);
}CComPtr<ISpVoice> cpVoice;
// 获取ISpVoice接口
HRESULT hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
if (SUCCEEDED(hr)) {
hr = cpVoice->Speak(szReport, SPF_DEFAULT, NULL);//SPF_IS_XML
cpVoice.Release();
}//释放资源
::CoUninitialize();
}VOID CheckTime(BOOL start) {
time_t tNow = ::time(NULL);
struct tm *tmNow = ::localtime(&tNow);// 启动时,整点时,18点后/9点前每半小时
if (start || (tmNow->tm_sec == 0 && (tmNow->tm_min == 0 || (tmNow->tm_min == 30 && (tmNow->tm_hour >= 18 || tmNow->tm_hour < 9))))) {
ReportClock(tmNow->tm_hour, tmNow->tm_min);
}
}
赞!
当时不小心把Mac正点报时打开了,还吓了一跳,不知道怎么关闭……
写程序的时候经常忘记时间,有个报时的程序在那儿提醒着也挺好。
当然,玩游戏的时候也会不太注意时间。