原理: 利用定时器去检查,如输入的是多少分钟后关机,就根据输入的分钟数产生一个COUNT计数器,计数器一直递减,直到1,然后执行关机。如输入的是几时几分关机,那么定时器会每次都检查系统的时间和你输入的时间是否一直,如果是就执行关机。

MFC做界面还真的是(可能是水平不行吧),怎么弄都是这个样,不好看...

为了防止多个程序同时运行,就限制系统只运行一个程序运行,如下(放到InitInstance中即可):

	HANDLE hSem=CreateSemaphore(NULL,1,1,m_pszExeName);//创建一个新的信号量

	if(GetLastError()==ERROR_ALREADY_EXISTS)//因为已经存在一个,所以创建失败
{
MessageBox(NULL,_T("程序已运行!!!"),NULL,0);
exit(2);
}

主要实现如下:

void CShutDownDlg::OnOK()
{
// TODO: Add extra validation here CString str4,str3,str2,str1,StrOut,s,t;
int a,b;
CTime Time=CTime::GetCurrentTime();//以下GetHour()函数需要先在这里得到当前时间对整个CTime结构体进行初始化
int temp=0;
flag0=0;//使用多少分钟后关机标志位
flag1=0;//使用几时几分关机标志位
m_Edit2.GetWindowText(str2);
m_Edit3.GetWindowText(str3);
m_Edit4.GetWindowText(str4);
if(atoi(str2)>0){//检查输入数据的有效性
flag0=1;
temp=atoi(str2);
count=temp*60;//转换为秒 int Hour = Time.GetHour();
int Min = Time.GetMinute(); a=(Hour+(Min+temp)/60)%24;
b=(Min+temp)%60;
s.Format("%d",a);
t.Format("%d",b); StrOut="系统将在"+s+"时"+t+"分自动关闭计算机,请注意保存文件!";
MessageBox(StrOut,NULL,0);
SetTimer(1,1000,NULL);
}
else if(atoi(str3)>0&&atoi(str4)>0) {//检查输入数据的有效性
flag1=1;
StrOut="系统将在"+str3+"时"+str4+"分自动关闭计算机,请注意保存文件!";
h=atoi(str3);
m=atoi(str4); MessageBox(StrOut,NULL,0);
SetTimer(1,1000,NULL);
}
else
{MessageBox("关机时间设置不正确,请检查!",NULL,MB_OK);return;}
MessageBox("我隐藏在进程里了哦:-)!",NULL,MB_OK);
ShowWindow(SW_HIDE);//懒得做任务栏小图标了,直接隐藏主程序吧,嘿嘿
}

定时

void CShutDownDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CTime tm=CTime::GetCurrentTime();
CString str,strt;
str=tm.Format("%m月%d日 %X");
m_Edit1.SetWindowText(str);
int hour = tm.GetHour();
int min = tm.GetMinute();
if(1==flag0)
{ count--;
if(1==count) {
if(0==SystemShutdown())
{
sndPlaySound ("c:\\sound\\music.wav ",SND_ASYNC);//加个声音提醒哈,怕你睡着了,需要导入winmm.lib库才能使用
MessageBox("关机失败");
}
exit(0);}
}
else if (1==flag1)
{
if(hour==h&&min==m)
{ if(0==SystemShutdown())
{
sndPlaySound ("c:\\sound\\music.wav ",SND_ASYNC);//加个声音提醒哈,怕你睡着了,需要导入winmm.lib库才能使用
MessageBox("关机失败");
exit(0);} }
}
} CDialog::OnTimer(nIDEvent);
}

关机实现函数SystemShutdown

bool SystemShutdown(){
HANDLE hToken;
TOKEN_PRIVILEGES tkp;//设置访问特权变量
//OpenProcessToken 获取进程的访问令牌
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))
{
MessageBox(NULL,"获取访问令牌失败!",NULL,0);
return FALSE;
}
// LookupPrivilegeValue查看系统的特权值
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // 指定特权数组个数1
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;//启用特权
// AdjustTokenPrivileges的作用是通知Windows NT修改本进程的权利
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);//启用当前访问令牌的特权
if (GetLastError() != ERROR_SUCCESS) //失败
{
MessageBox(NULL,"获取权限失败!",NULL,0);
return FALSE;
}
if (!ExitWindowsEx(EWX_SHUTDOWN, 0)) //参数在这里设置。EWX_SHUTDOWN 为正常关机,强行退出为WINDOWSEWX_FORCE。
return FALSE;
return TRUE;
}

判断选择的是哪种模式的定时关机,加在OnTimer里

//更新:判断编辑框是否获得焦点,如编辑框2获得焦点,那么采用多少分钟后关机模式,则几时几分关机模式禁用
//如编辑框3或编辑框4获得焦点,那么采用几时几分关机模式,禁用多少分钟后关机模式
//如别的控件获得焦点,那么两个都可以使用
if(::GetFocus()==m_Edit2.GetSafeHwnd())
{
m_Edit3.SetWindowText(NULL);
m_Edit3.EnableWindow(FALSE);
m_Edit4.SetWindowText(NULL);
m_Edit4.EnableWindow(FALSE); }
else if(::GetFocus()==m_Edit3.GetSafeHwnd()||::GetFocus()==m_Edit4.GetSafeHwnd())
{
m_Edit2.SetWindowText(NULL);
m_Edit2.EnableWindow(FALSE);
}
else
{
m_Edit2.EnableWindow(TRUE);
m_Edit3.EnableWindow(TRUE);
m_Edit4.EnableWindow(TRUE);
}

我的定时关机程序(MFC实现) .的更多相关文章

  1. MFC定时关机程序的实现1

    写个定时关机程序自用,界面简单实用,最终界面如下 第一步,新建一个MFC对话框应用程序,拖几个控件过来, 界面如下: 然后给下拉列表框,复选按钮绑定变量,以方便进行操作. CComboBox m_co ...

  2. MFC定时关机程序的实现3-最小化到托盘栏

    这个定时关机运行过后默认最小化到托盘栏最好了,不用每次都去点了. 现在来看看如何将程序显示在托盘栏. 首先在头文件里声明一个变量和一个消息响应函数 //最小化到托盘栏 //第一步,生成一个成员变量,或 ...

  3. MFC定时关机程序的实现2-添加启动项到注册表

    虽然上一篇实现了的定时关机,但是还不够完善,比如开机自动启动,然后按照配置的时间定时关机,并最小化到任务栏. 先来说开机启动怎么实现,开机启动实现的方法有好几种,比如直接在开始菜单启动项里添加一个程序 ...

  4. window 定时关机小程序bat

    复制以下文本,新建txt文件并修改为bat后缀 如图: @echo off title 定时关机 echo 定时关机程序 echo ---------------------------------- ...

  5. C# 简单的定时关机

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. MFC入门(二)-- 提取输入框的字符串(定时关机的小程序)

    上篇文章已经让我们有了对于MFC最简单直观的认识,但貌似并无太大的交互性可言,而且其实也没有涉及到数据的交互,所以本文通过做一个时间可以调节的定时关机的Demo来演示. MFC入门(一)地址:http ...

  7. 【转载】Win7利用任务计划程序实现定时关机

    在Win7.Win8或者Win10系统中,如果要实现电脑的自动定时关机,不需要借用任何的外部程序,直接系统自带的任务计划程序即可实现电脑的定时自动关机,支持设定电脑关机时间以及执行频率次数,如固定每天 ...

  8. JAVA定时关机小程序

    大一刚学java时候做的小程序.由于当时迅雷还没有下载完成关机,晚上要下很多学习资料.只有自己算时间然后通过shutdown命令设置时间关机. 当时通过shutwodn命令,想到能否通过java做一个 ...

  9. Windows: 在系统启动时运行程序、定时计划任务、定时关机

    lesca今天介绍一些让系统在启动时,而非登录时,加载用户自定义的应用程序或脚本的方法,推荐度从前到后依次递减. 1. Windows任务计划(task scheduler) 用户可以按以下步骤进行操 ...

随机推荐

  1. css3学习01

    1.圆角边框(div的一个属性:border-radius) <!DOCTYPE html> <html> <head> <style> div { t ...

  2. LoadRunner参数值定义-摘自一米阳光

    深入解析LoadRunner下的参数化取值   熟悉LoadRunner的人,相信都会经常使用参数化功能,但是对于参数化的使用到底了解多少,就值得深思了.包括本人在内也是,每次在做压力测试的时候,基本 ...

  3. Date时间对象方法

  4. Hibernate5--课程笔记1

    Hibernate简介: Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hib ...

  5. Failed to read candidate component class包冲突解决方法

    该类问题出现错误有两个可能,第一JAR包错误,第二就是我们的System library版本不正确导致的问题.

  6. IIS7或IIS7.5 ISAPI和CGI限制找不到的问题记录

    弄了一下午,才找到,选择最上面的节点,如下图,记录备用

  7. js--冒泡排序[由小到大]

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  8. 为啥使用Iscroll.js之后,a不能触发点击事件?

    原因:是iscroll.js阻止了a的行为. 解决方法:打开iscroll-probe.js,然后找到preventDefaultException方法. 然后修改为: // preventDefau ...

  9. [ An Ac a Day ^_^ ] hdu 4565 数学推导+矩阵快速幂

    从今天开始就有各站网络赛了 今天是ccpc全国赛的网络赛 希望一切顺利 可以去一次吉大 希望还能去一次大连 题意: 很明确是让你求Sn=[a+sqrt(b)^n]%m 思路: 一开始以为是水题 暴力了 ...

  10. GitHub赠送DigitalOcean优惠码100美元

    著名的项目托管网站GitHub本周联合DigitalOcean VPS和NameCheap送给学生福利了!十余种产品免费拿!包括免费赠送digitalocean优惠码价值100美元!以及nameche ...