如何通过MFC编写一个恶搞版自动关机程序,实现长尾词的趣味互动?

2026-04-12 05:011阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计752个文字,预计阅读时间需要4分钟。

如何通过MFC编写一个恶搞版自动关机程序,实现长尾词的趣味互动?

使用MFC实现了自动关机程序(恶搞版),输入作者真帅,30秒后自动关机。程序涉及编辑框的输入输出、定时器的使用、按钮事件添加、弹窗提示等,本身很简单。

如何通过MFC编写一个恶搞版自动关机程序,实现长尾词的趣味互动?

用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系统关机代码。

本文共计752个文字,预计阅读时间需要4分钟。

如何通过MFC编写一个恶搞版自动关机程序,实现长尾词的趣味互动?

使用MFC实现了自动关机程序(恶搞版),输入作者真帅,30秒后自动关机。程序涉及编辑框的输入输出、定时器的使用、按钮事件添加、弹窗提示等,本身很简单。

如何通过MFC编写一个恶搞版自动关机程序,实现长尾词的趣味互动?

用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系统关机代码。