2008年(10)
分类: C/C++
2008-05-30 09:44:39
protected:
// 记录软件的启动时间CTime m_tmStartup;
DWORD m_dwStartupTickValue;
BOOL m_bCanChangeSystemTime;
void Reset_CanChangeSystemTime(void) { m_bCanChangeSystemTime = FALSE; }
void Set_CanChangeSystemTime(void) { m_bCanChangeSystemTime = TRUE; }
// 初始化用来阻止修改系统时间的变量
m_tmStartup = CTime::GetCurrentTime();
m_dwStartupTickValue = ::GetTickCount();
Reset_CanChangeSystemTime();
void CDummyDlg::OnTimeChange()
{
CDialog::OnTimeChange();////////////////////////////////////////////////////////////
// 以下代码将完成“系统时间保护”的功能
////////////////////////////////////////////////////////////
/* 试图被修改的时间 (此时已经被修改了) */
CString csTrytoChanged = CTime::GetCurrentTime().Format("%Y-%m-%d %H:%M:%S");
if (! m_bCanChangeSystemTime)
{
/* get duration from scb startup (as seconds) */
DWORD dwDuration = (::GetTickCount() - m_dwStartupTickValue) / 1000;
/* get the time we should set back to system clock */
CTime tmSetBack = m_tmStartup + CTimeSpan(dwDuration);
/* set back the time, prevent modifying */
SYSTEMTIME st;
tmSetBack.GetAsSystemTime(st);
Set_CanChangeSystemTime(); // 关闭保护,这样我们才能修改时间
if (! ::SetLocalTime(&st)) Reset_CanChangeSystemTime(); // 修改完成后,重新开启保护
// Popup user message
CString csMsg;
csMsg.Format(IDS_STRING33016, csTrytoChanged); // IDS_STRING33016的内容是:"系统时间试图被修改为%s,已拦截。"
MessageBox(csMsg);
}
else Reset_CanChangeSystemTime(); /* reset the flag */}