我的定时关机程序(MFC实现) .

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

原理: 利用定时器去检查,如输入的是多少分钟后关机,就根据输入的分钟数产生一个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);
	}
技术改变世界! --狂诗绝剑
目录
相关文章
|
4月前
|
安全 数据库 数据安全/隐私保护
基于易语言开发的定时关机程序
基于易语言开发的定时关机程序
34 0
|
分布式计算 Linux Android开发
这 8 款 Windows 屏保程序,让你的锁屏都格调满满
这 8 款 Windows 屏保程序,让你的锁屏都格调满满
738 0
这 8 款 Windows 屏保程序,让你的锁屏都格调满满
MFC下运行控制台不显示黑屏
MFC下运行控制台不显示黑屏
78 0
|
Shell Windows
Windows程序设计打开另一个程序的三种方法
Windows程序设计打开另一个程序的三种方法
490 0
|
存储 安全 Linux
【MFC】 MFC文件操作和注册表操作
【MFC】 MFC文件操作和注册表操作
【MFC】 MFC文件操作和注册表操作
|
Linux Windows
Qt6 防止程序多重启动,并实现双击图标显示已运行的程序
欢迎来到我的博客,希望这篇文章对你有所帮助,如果觉得不错,请点赞搜藏哈。
472 0
Qt [GC9-5]:给我的程序添加启动画面(触发编译警告)
Qt [GC9-5]:给我的程序添加启动画面(触发编译警告)
135 0
Qt [GC9-5]:给我的程序添加启动画面(触发编译警告)
编写一个闹钟和定时关机工具(MFC VS2010)
这个小工具在自己生活当中能用到,运行软件以后,会显示当前的系统时间,然后你可以设定时间,再选择是定时响铃还是关机。截图如下: 前言:本程序采用visual studio 2010 ,对话框类型的应用程序,生成的类视图如下,右边为CTimeDlg类的本分函数:     主要的实现方法和关键点如下: 1.
1117 0
|
C# 小程序
C# 定时关机小程序
C# 定时关机小程序 1.打开VS2019,创建界面和按钮 2. 代码如下: private void button1_Click(object sender, EventArgs e) { downpc(txttime.
1429 0
|
网络安全 Windows 应用服务中间件
Visual Studio 2017 调试器的工作进程(msvsmon.exe)意外退出 调试将终止
原文:Visual Studio 2017 调试器的工作进程(msvsmon.exe)意外退出 调试将终止 开发环境: Windows 10 in Parallels Desktop Visual Studio 15.6 场景还原: 使用 Visual Studio 15.6 (即 Visual Studio 2017) 新建 ASP.NET Core MVC 项目,启动调试,提示: 调试器的工作进程(msvsmon.exe)意外退出。
2732 0