秋梦无痕

一场秋雨无梦痕,春夜清风冻煞人。冬来冷水寒似铁,夏至京北蟑满城。

Avatar

整点报时程序

在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正点报时打开了,还吓了一跳,不知道怎么关闭……

写程序的时候经常忘记时间,有个报时的程序在那儿提醒着也挺好。
当然,玩游戏的时候也会不太注意时间。