原理: 利用定时器去检查,如输入的是多少分钟后关机,就根据输入的分钟数产生一个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. Starting httpd: (98)Address already in use: make_sock: could not bind to address [::]:80

    netstat -tulpn| grep :80 killall -9 httpd /etc/init.d/httpd start  or service httpd start

  2. 网站引导页flash动画跳转js脚本

    if (getCookie("guidance") == null) { document.cookie = "guidance=true"; window.l ...

  3. 关于PHP的一小段代码求解如下求解"%2\$s"

    <?php$format = "The %2\$s contains %1\$d monkeys";printf($format, 8, "北京");?& ...

  4. mapreduce on yarn简单内存分配解释

    关于mapreduce程序运行在yarn上时内存的分配一直是一个让我蒙圈的事情,单独查任何一个资料都不能很好的理解透彻.于是,最近查了大量的资料,综合各种解释,终于理解到了一个比较清晰的程度,在这里将 ...

  5. js检测文章敏感词

    在一些博客或者论坛中,文章中的敏感词需要显示出来和高亮显示起到提示用户的作用.这个功能实现的方法有很多,下面是js的实现方式. //将文章中匹配到的敏感词罗列出来 <span style=&qu ...

  6. yield 学习笔记

    第三部分(先看) 先讲 iterator 和 iterable 可迭代对象 (Iterable) 是实现了__iter__()方法的对象, 通过调用iter()方法可以获得一个迭代器 (Iterato ...

  7. 解题报告8VC Venture Cup 2017 - Elimination Round

    题目链接:http://codeforces.com/contest/755 本蒟蒻做了半天只会做前两道题.. A. PolandBall and Hypothesis 题意:给出n,让你找出一个m, ...

  8. CentOS启动不显示图形界面直接进入命令行模式

    我现在用的是 CentOS 6.3 开机后进入图形化界面还是进入命令行取决于inittab文件中的配置.该文件位于etc目录下. # vi /etc/inittab 找到下面的语句: # Defaul ...

  9. JUit——(三)JUnit核心对象(测试、测试类、Suit和Runner)

    JUnit的核心对象:测试.测试类.测试集(Suite).测试运行器 1. 测试: @Test注释的.公共的.不带有任何参数.并且返回void类型的方法 2. 测试类: 公共的,包含对应类的测试方法的 ...

  10. 从零开始学Axure原型设计(进阶篇)

    Axure不仅能制作静态的视觉稿.页面,还能添加交互动作,是进行原型设计的最佳软件之一.在认识了Axure的界面和部件库之后,我们可以用它来画线框图了,但是静态的线框图在表达上不如有交互的原型图来得直 ...