mfc关机程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);//开始关机

相关文档
最新文档