C++--------检测电脑是否休眠过

本文介绍了一个用于检测电脑是否进入睡眠状态并记录测试结果的方法。通过监听WM_POWERBROADCAST消息来判断系统是否进入睡眠及唤醒状态,并使用定时器进行倒计时,最终将测试结果写入日志文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前一阵子,产测上需要这么一种功能------检测电脑是否睡眠过,现在记录一下主要的实现代码。

// TODO: 在此添加额外的初始化代码
	CString strCommandLine = GetCommandLine();
	strCommandLine.TrimLeft().TrimRight();
	CString strTimeout;
	int idx = strCommandLine.Find(_T(" "));
	if (idx != -1)
	{
		strTimeout = strCommandLine.Mid(idx+1);
		strTimeout.TrimLeft().TrimRight();
				
		//m_nTimeout = _ttoi(strTimeout);
		//======================================================//
		m_nTimeout = 50;
	}
	
	TRACE(_T("m_nTimeout = %d\r\n"),m_nTimeout);

	SetTimer(TIMER1,TIMER1_INTERVAL,NULL);

LRESULT CPowerMonitorDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	// TODO: 在此添加专用代码和/或调用基类
	//TRACE(_T("%04x\r\n"),message);
	switch (message)
	{
		

	case WM_POWERBROADCAST:
		{
			TRACE(_T("%04x\r\n"),wParam);
			//系统睡眠了
			if(wParam == PBT_APMSUSPEND)
			{
				m_bAPMSUSPEND = TRUE;
			}
			//系统唤醒了
			else if (wParam == PBT_APMRESUMESUSPEND)
			{
				m_bAPMRESUMESUSPEND = TRUE;
			}
		}
		break;
	default:
		break;
	}
	return CDialogEx::WindowProc(message, wParam, lParam);
}

void CPowerMonitorDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	switch (nIDEvent)
	{
		
	case TIMER1:
		{
			m_dwCnts++;
			TRACE(_T("m_dwCnts=%d\r\n"),m_dwCnts);
			CString strSeconds;
			strSeconds.Format(_T("%ds"),m_nTimeout-m_dwCnts);
			//strSeconds.Format(_T("%ds"), 40);
			GetDlgItem(IDC_STATIC_TIMER)->SetWindowText(strSeconds);

			//3秒钟后执行
			//if (m_dwCnts==3)
			//{
			//	system("shutdown -h");
			//	//SetSystemPowerState(false, false);
			//	//Sleep(1000*6);
			//}
		
			CString  strTemp;
			CFile  mFile;
			DWORD dwAttr = GetFileAttributes(_T("C://test"));
			//若文件夹不存在,创建文件夹

			if (dwAttr == 0xFFFFFFFF){
				CreateDirectory(_T("C://test"), NULL);
			}
			else{
				mFile.Open(_T("C://test//log.txt "), CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite);
			}
						
			WORD unicode = 0xFEFF; //这句重要
			mFile.SeekToBegin();
			mFile.Write(&unicode, 2); //这句重要    

			CTime time = CTime::GetCurrentTime(); ///构造CTime对象
			CString m_strTime = time.Format("%Y-%m-%d %H:%M:%S");
		
			if (m_bAPMSUSPEND && m_bAPMRESUMESUSPEND)
			{
				SetTimer(TIMER2,TIMER2_INTERVAL,NULL);
				m_bResult = TRUE;
				KillTimer(TIMER1);
				mFile.SeekToEnd();
				mFile.Write(_T("\r\n"), sizeof(_T("\r\n")));
				strTemp = _T("TestTime:") + m_strTime + _T(" result:pass ");
				mFile.Write(strTemp, wcslen(strTemp)*sizeof(wchar_t));
				GetDlgItem(IDC_STATIC_INFO)->SetWindowText(_T("测试通过!"));
				

			}
			else if(m_dwCnts >= static_cast<DWORD>(m_nTimeout))
			{
				SetTimer(TIMER2,TIMER2_INTERVAL,NULL);
				m_bResult = FALSE;
				KillTimer(TIMER1);
				mFile.SeekToEnd();
				mFile.Write(_T("\r\n"), sizeof(_T("\r\n")));
				strTemp = _T("TestTime:") + m_strTime + _T(" result:fail ");
				mFile.Write(strTemp, wcslen(strTemp)*sizeof(wchar_t));
				GetDlgItem(IDC_STATIC_INFO)->SetWindowText(_T("测试失败!"));
				
			}
			mFile.Flush();
			mFile.Close();
		}
		break;
	case TIMER2:
		{
			KillTimer(TIMER2);
			if (m_bResult)
			{
				exit(0);
			}
			else
			{
				exit(1);
			}
		}
	default:
		break;
	}
	CDialogEx::OnTimer(nIDEvent);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值