写个定时关机程序自用,界面简单实用,最终界面如下
第一步,新建一个MFC对话框应用程序,拖几个控件过来,
界面如下:
然后给下拉列表框,复选按钮绑定变量,以方便进行操作。
CComboBox m_com_hour;
CComboBox m_com_minute;
CComboBox m_com_second;
第二步,先实现简单关机功能,不通过文件读写进行关键。在选择过时间后,确定关机后按时关机。
1,给下拉列表框添加更改事件,直接右键控件->选择添加事件处理程序,选择CBN_SELCHANGE
然后编辑代码,添加如下:
1 void CAutoShutDownDlg::OnCbnSelchangeCombo1()//时 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 int sel = 0; 5 sel = m_com_hour.GetCurSel();//这个是获取当前鼠标选择的时间的索引,从零开始的 6 hour = sel;//hour是添加的成员变量,还有minute和second,这就是关机时间 7 }
还有其他的分钟和秒类似这个,这里不多说了,代码如下
1 void CAutoShutDownDlg::OnCbnSelchangeCombo2()//分 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 int sel = 0; 5 sel = m_com_minute.GetCurSel(); 6 minute = sel; 7 } 8 9 10 void CAutoShutDownDlg::OnCbnSelchangeCombo3()//秒 11 { 12 // TODO: 在此添加控件通知处理程序代码 13 int sel = 0; 14 sel = m_com_second.GetCurSel(); 15 second = sel; 16 }
现在可以获取程序中选择的时间了,然后就是获取这些信息,在单击过确定按钮后弹出确认窗口,确认关机时间。
在资源窗口直接双击确认按钮进入按钮按下消息响应程序
1 void CAutoShutDownDlg::OnBnClickedOk() 2 { 3 // TODO: 在此添加控件通知处理程序代码 4 //复选框是否选中,这个处理是否添加开机启动项,后面再说这个 5 UINT ischecked = IsDlgButtonChecked(IDC_CHECK1); 6 7 //获取选择的时间 8 hour = m_com_hour.GetCurSel(); 9 minute = m_com_minute.GetCurSel(); 10 second = m_com_second.GetCurSel(); 11 12 //数据进行格式化处理 13 CString str = ""; 14 str.Format("%2d时%2d分%2d秒", hour, minute, second); 15 // GetDlgItem(IDC_STATIC_NOW)->SetWindowText(str); 16 int resoult = MessageBox("确定要在"+str+"关机吗?","是否关机?",MB_OKCANCEL); 17 if (resoult == IDOK) 18 { 19 //是否添加到启动项,这里用来检查是否写入到开机启动项,直接写入注册表,这个后面再说 20 AutoStart(ischecked); 21 //更新程序窗口中显示的关机时间 22 GetDlgItem(IDC_STATIC_SHUT)->SetWindowText(str); 23 24 FILE *file; 25 int err; 26 err = fopen_s(&file, "c:\\ShutDownTime.txt", "w+"); 27 if (!err) 28 { 29 err = fprintf_s(file, "%02d%02d%02d",hour, minute, second); 30 if (err == EOF) 31 { 32 MessageBox("请重试!"); 33 } 34 } 35 else 36 { 37 MessageBox("文件打开错误"); 38 } 39 if (fclose(file) != 0) 40 { 41 MessageBox("文件关闭错误"); 42 } 43 44 } 45 }
现在来看看OnInitDialog()函数里做了什么
这里主要用来读取上次保存的关机时间
1 //读取软件设置的默认时间 2 FILE *file; 3 errno_t err; 4 err = fopen_s(&file, "c:\\ShutDownTime.txt", "a+"); 5 if (!err) 6 { 7 fscanf_s(file, "%02d%02d%02d",&hour, &minute, &second); 8 } 9 else 10 { 11 MessageBox("文件打开错误"); 12 } 13 if (fclose(file) != 0) 14 { 15 MessageBox("文件关闭错误"); 16 } 17 str = ""; 18 str.Format("%2d时%2d分%2d秒", hour, minute, second); 19 GetDlgItem(IDC_STATIC_SHUT)->SetWindowText(str); 20 SetTimer(0,100,NULL);//定时刷新当前时间 21 SetTimer(1, 1000, NULL);//定时检查是否到达关机时间
这里主要用了两个定时器来检查关机时间。
还有一个默认显示的关机时间,当第一次打开程序时,并没有关机时间,这里默认现在当前的时间,关机时间会在确认关机后更新。
1 GetTime();//获取当前时间,自定义的成员函数 2 CString str = ""; 3 str.Format("%2d时%2d分%2d秒", hour, minute, second); 4 GetDlgItem(IDC_STATIC_NOW)->SetWindowText(str); 5 6 7 int temp = 0; 8 int i = 0; 9 //设置默认显示的小时 10 str = ""; 11 for (i = 0; i <= 23; i++) 12 { 13 str.Format("%2d时", i); 14 m_com_hour.AddString(str); 15 } 16 m_com_hour.SetCurSel(hour); 17 //设置默认显示的分钟 18 str = ""; 19 20 for (i = 0; i <= 59; i++) 21 { 22 str.Format("%2d分", i); 23 m_com_minute.AddString(str); 24 } 25 m_com_minute.SetCurSel(minute); 26 //设置默认显示的妙 27 str = ""; 28 29 for (i = 0; i <= 59; i++) 30 { 31 str.Format("%2d秒", i); 32 m_com_second.AddString(str); 33 } 34 m_com_second.SetCurSel(second);
其中GetTime()为自定义的成员函数,用于获取当前时间
1 void CAutoShutDownDlg::GetTime() 2 { 3 CTime time1 = CTime::GetCurrentTime();//获取系统当前时间 4 hour = time1.GetHour(); 5 minute = time1.GetMinute(); 6 second = time1.GetSecond(); 7 }
现在能实现关机了,不过程序没法最小化到任务栏,实在不方便,明天继续研究这个。