当前位置 : 主页 > 编程语言 > c语言 >

MFC练习4:自动关机程序(恶搞版)

来源:互联网 收集:自由互联 发布时间:2023-08-25
用MFC实现了一个自动关机程序(恶搞版),需要输入“作者真帅”,不然会在30s后自动关机。程序涉及编辑框的输入输出、定时器的使用,按钮事件的添加、弹窗提示等,本身很简单。

用MFC实现了一个自动关机程序(恶搞版),需要输入“作者真帅”,不然会在30s后自动关机。程序涉及编辑框的输入输出、定时器的使用,按钮事件的添加、弹窗提示等,本身很简单。自动关机部分参考了网上的代码,在Win10系统上验证正常。

一、界面展示

这是一个MFC对话框类型的程序,整体界面如下。

界面1.jpg

二、关键代码

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.jpg

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.jpg

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);
}

界面4.jpg

三、总结

1、练习使用编辑框,涉及到数据的获取和设置,以及Int类型和CString的转换;

2、练习定时器及其事件响应的相关操作;

3、学习Win系统关机代码。

上一篇:尺取法例题C++
下一篇:没有了
网友评论