mfc关机程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件学院大作业任务书
题目:用mfc制作关机程序
专业:计算机软件
班级:112班
姓名和学号:张文斌8000611074
1.作业分析
1.1项目介绍
制作一个自动关机程序,到指定时间可以关机,并且可以有取消操作和显
示当前时间的功能
1.2 功能需求
1.可以显示系统时间及日期
2.选择关机时间,当系统时间和关机时间重合时关机
3.可以有取消操作的功能
4.显示距离关机还有多长时间
2.分析
2.1需要解决的问题
1.添加各个控件并添加相应功能
2.获取系统版本号并获取关机权限
3.如果当前时间大于设定时间,则显示在第二天的设定时间关机2.2程序流程图
否
是
开始
显示系统时间
设置关机时间
关机剩余时间取消关机关机结束
3.程序设计
3.1主要函数
BOOL Main_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam);
void Main_OnCommand(HWND hwnd,UINT id,HWND hwndCtr,UINT codeNotify);
void Main_OnClose(HWND hwnd);
3.2主要功能及实现
3.2.1在初始化函数里设置定时器
BOOL Main_OnInitDialog(HWND hwnd,HWND hwndFocus,LPARAM lParam)//初始化函数
{
SetTimer(hwnd,1,1000,ShowTime);//定时器,1000ms 运行一次,1为定时器ID,ShowTime为运行函数
return true;
}
3.2.2定时器代码,显示时间
void CALLBACK ShowTime(HWND hwnd,UINT message,UINT uTimerID,DWORD dwTime)
{
SYSTEMTIME Time;//设置时间结构体
GetLocalTime(&Time);//获得电脑时间
TCHAR time[100];//定义辅助数组
wsprintf(time,"%02d:%02d:%02d %d/%02d/%02d",
Time.wHour,Time.wMinute,Time.wSecond,Time.wYear,Time.wMonth,Time.wDay);//得到时间字符
SetDlgItemText(hwnd,IDC_STATICNOW,time);//将时间字符串显示到
IDC_STATICNOW控件里
3.2.3确定时间的有效性,取得用户确认
case IDC_BUTTON1://"确定关机"按钮的ID
{
if(false == IsClose)
{
UINT Hour ,Min ,Sec;//定义小时,分钟,秒钟变量
TCHAR GetTime[100];//定义辅助字符串
GetDlgItemText(hwnd,IDC_DATETIMEPICKER1,GetTime,sizeof(GetTime));//得到时间选取
sscanf(GetTime,"%d:%d:%d",&Hour,&Min,&Sec);//将字符串里的值分别赋给他们三个
//sscanf是#include
//以下是检验时间有效性
SYSTEMTIME Time;
GetLocalTime(&Time);
//LONG NTime,GTime;//定义现在时间和得到的时间总秒数变量
//由于之后的定时器2需要用到GTime变量,所以这里将Gtime变为全局变量
LONG NTime;
GTime=Hour * 3600 + Min * 60 + Sec;
NTime = Time.wHour *3600+ Time.wMinute * 60+Time.wSecond;//现在的时间
if((NTime)>=GTime)
{
UINT i;
i=MessageBox(hwnd,TEXT("所选取的时间为第二天!\n继续请点击Yes,重新选择请点击No"),
TEXT("提示"),MB_YESNO|MB_ICONQUESTION);//的值为所选择的按钮id
if(IDNO==i)
break;
}
3.2.
4.设置全局变量,作为定时器检测关机
IsClose=true;//开始检查时间
3 .2.5时间检测代码
if(true== IsClose)
{
LONG NTime;
NTime = Time.wHour*3600 + Time.wMinute*60+Time.wSecond ;
LONG Remain = (GTime - NTime);//定义变量,得到剩余时间总秒数
if(Remain < 0)
Remain =3600 *24 + Remain;
TCHAR cRemain[100];
wsprintf(cRemain,"距离关机:%02d:%02d:%02d",Remain/3600,(Remain/60)%60,Remain%60);
SetDlgItemText(hwnd,IDC_STATICREMAIN,cRemain);
if(Remain == 0)
{
ShutDown(hwnd);//自定义函数,关机函数
}
}
}
3.2.6.关机代码
void ShutDown(HWND hwnd)
{
OSVERSIONINFO os;
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&os);//获取系统版本
if(VER_PLATFORM_WIN32_NT==os.dwPlatformId)//32位操作系统
{
HANDLE handle;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_Q UERY,&handle);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;//one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(handle,FALSE,&tkp , 0 ,(PTOKEN_PRIVILEGES)NULL,0);
if (GetLastError()!= ERROR_SUCCESS)//确定权限正确
{
MessageBox(hwnd,"AdjusTokenPrivileges 权限出错!","error",MB_OK|MB_ICONERROR);
}
}
ExitWindowsEx(EWX_SHUTDOWN,0);//开始关机