用MFC实现了一个自动关机程序(恶搞版),需要输入“作者真帅”,不然会在30s后自动关机。程序涉及编辑框的输入输出、定时器的使用,按钮事件的添加、弹窗提示等,本身很简单。自动关机部分参考了网上的代码,在Win10系统上验证正常。
一、界面展示
这是一个MFC对话框类型的程序,整体界面如下。
二、关键代码
1、添加“确定”按钮事件
void CjokeDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CString strInput;
m_edit1.GetWindowTextW(strInput);
CString str = _T("作者真帅");
if (str == strInput)
{
KillTimer(1);
AfxMessageBox(_T("好吧,眼光不错,嘿嘿"), MB_OK | MB_ICONEXCLAMATION);
}
}
2、添加“关闭”按钮事件
void CjokeDlg::OnBnClickedClose()
{
// TODO: 在此添加控件通知处理程序代码
CString strInput;
m_edit1.GetWindowTextW(strInput);
CString str = _T("作者真帅");
if (str == strInput)
{
KillTimer(1);
AfxMessageBox(_T("您受惊了,现在开始关闭窗口"), MB_OK | MB_ICONEXCLAMATION);
DestroyWindow();
}
}
3、定时器的使用
(1)定时器SetTimer这个API函数原型;
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了
(2)在OnInitDialog()中将时间显示到主界面“倒计时”编辑框中,并初始化定时器;
timeCnt = 30;
CString str;
str.Format(_T("%d"), timeCnt);
m_edit2.SetWindowTextW(str);
SetTimer(1, 1000, NULL);
(3)添加定时器事件处理函数。在30s内不断更新“倒计时”编辑框的数值,到达30s时,弹窗提示“开始自动关机”,并在点击“确定”后调用自动关机代码实现功能。
void CjokeDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch (nIDEvent)
{
case 1:
timeCnt--;
if (timeCnt <= -1)
{
KillTimer(1);
AfxMessageBox(TEXT("开始自动关机!!!"), MB_OK);
//下面是关机代码
#if 1
TOKEN_PRIVILEGES tp;
HANDLE hToken;
LUID luid;
LPTSTR MachineName = NULL;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
// PERR("OpenProcessToken",GetLastError());
return;
}
if (!LookupPrivilegeValue(MachineName, SE_SHUTDOWN_NAME, &luid))
{
// PERR("LookupPrivilegeValue", GetLastError());
return;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL); //到这里,是取得权限///
ExitWindowsEx(EWX_POWEROFF, EWX_FORCE);
#endif
}
else
{
CString str;
str.Format(_T("%d"), timeCnt);
m_edit2.SetWindowTextW(str);
}
break;
}
CDialogEx::OnTimer(nIDEvent);
}
三、总结
1、练习使用编辑框,涉及到数据的获取和设置,以及Int类型和CString的转换;
2、练习定时器及其事件响应的相关操作;
3、学习Win系统关机代码。
标签:定时器,strInput,CString,自动关机,MFC,str,添加,恶搞 From: https://blog.51cto.com/sannywoods/7066601