VC++实现自动关机(2012-07-17 09:15:13)转载▼标签: it
一、关机核心类
close.cpp
// Close.cpp : 实现文件
//
#include "stdafx.h"
#include "CloseComputer.h"
#include "Close.h"
// CClose 消息处理程序
DWORD WINAPI GetVerInfo()
{
OSVERSIONINFO osver={sizeof(OSVERSIONINFO)};
GetVersionEx(&osver);
return osver.dwMajorVersion;
}
//关机
int ShouDown(DWORD verInfo)
{
try
{
//如果获取到的系统dwMajorVersion值大于等于,表示为NT以上操作系统,需提升进程权限
if(verInfo>=5)
{
HANDLE ToHandle;
TOKEN_PRIVILEGES tkp;
//打开本进程访问信令
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&ToHandle))
{
//修改本进程权限
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
//通知系统已修改
AdjustTokenPrivileges(ToHandle,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
//获得权限后关闭计算机
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
}
}
//否则为以下,直接调用ExitWindowsEx函数即可
else
{
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
}
return 0;
}
catch(...)
{
//出现任何错误则返回
//printf("关机失败,请确认程序是否被拦截或具有管理权限!");
return -1;
}
}
//重启
int ReBoot(DWORD verInfo)
{
try
{
//如果获取到的系统dwMajorVersion值大于等于,表示为NT以上操作系统,需提升进程权限
if(verInfo>=5)
{
HANDLE ToHandle;
TOKEN_PRIVILEGES tkp;
//打开本进程访问信令
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&ToHandle))
{
//修改本进程权限
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
//通知系统已修改
AdjustTokenPrivileges(ToHandle,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
//获得权限后关闭计算机
ExitWindowsEx(EWX_REBOOT,0);
}
}
//否则为以下,直接调用ExitWindowsEx函数即可
else
{
ExitWindowsEx(EWX_REBOOT,0);
}
return 0;
}
catch(...)
{
//出现任何错误则返回
//printf("关机失败,请确认程序是否被拦截或具有管理权限!");
return -1;
}
}
//注销
int LogOff(DWORD verInfo)
{
try
{
//如果获取到的系统dwMajorVersion值大于等于,表示为NT以上操作系统,需提升进程权限
if(verInfo>=5)
{
HANDLE ToHandle;
TOKEN_PRIVILEGES tkp;
//打开本进程访问信令
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&ToHandle))
{
//修改本进程权限
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
//通知系统已修改
AdjustTokenPrivileges(ToHandle,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
//获得权限后关闭计算机
ExitWindowsEx(EWX_LOGOFF,0);
}
}
//否则为以下,直接调用ExitWindowsEx函数即可
else
{
ExitWindowsEx(EWX_LOGOFF,0);
}
return 0;
}
catch(...)
{
//出现任何错误则返回
//printf("关机失败,请确认程序是否被拦截或具有管理权限!");
return -1;
}
}
close.h
#pragma once
// CClose
DWORD WINAPI GetVerInfo();
int ShouDown(DWORD verInfo);
int ReBoot(DWORD verInfo);
int LogOff(DWORD verInfo);
二、控制部分
1.SetTime
在OnInitDialog 函数中加入:
SetTimer(0,1000,NULL);
2.添加OnTimer 事件
内部代码如下:
void CCloseComputerDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
this->UpdateData(1);
//this->UpdateData(0);
CTime t;
CString c_time;
int p;
t=CTime::GetCurrentTime();
p=t.GetDayOfWeek();
//刷新时间控件
this->V_TIME_SHOW=t.Format("%Y-%m-%d %H:%M:%S");
this->UpdateData(0);
switch( p)
{
case 1:
v_cweek=(bool)V_CHECK1;
break;
case 2:
v_cweek=(bool)V_CHECK2;
break;
case 3:
v_cweek=(bool)V_CHECK3;
break;
case 4:
v_cweek=(bool)V_CHECK4;
break;
case 5:
v_cweek=(bool)V_CHECK5;
break;
case 6:
v_cweek=(bool)V_CHECK6;
break;
case 7:
v_cweek=(bool)V_CHECK7;
break;
default:
v_cweek=false;
}
c_time=t.Format("%H%M%S");
if(c_time.Compare(c_v_time)==0 && v_cweek==true)
{
//调用关机函数
v_result=ShouDown(GetVerInfo());
v_result=1;//关闭成功
CDialog::OnCancel();//自我关闭
}
if (v_result==-1 )
{
MessageBox((LPCTSTR)CString("关机失败!"));
CDialog::OnCancel();//自我关闭
}
CDialog::OnTimer(nIDEvent);
}
3.其它控件事件代码
void CCloseComputerDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: 在此处添加消息处理程序代码
KillTimer(0);
}
void CCloseComputerDlg::OnBnClickedButtonC3()
{
// TODO: 在此添加控件通知处理程序代码
int v_result=LogOff(GetVerInfo());
if (v_result==-1 )
{
MessageBox((LPCTSTR)CString("注销失败!"));
}
}
void CCloseComputerDlg::OnBnClickedButtonC4()
{
// TODO: 在此添加控件通知处理程序代码
int v_result=ReBoot(GetVerInfo());
if (v_result==-1 )
{
MessageBox((LPCTSTR)CString("重启失败!"));
}
}
void CCloseComputerDlg::OnBnClickedButtonC2()
{
// TODO: 在此添加控件通知处理程序代码
int v_result=ShouDown(GetVerInfo());
if (v_result==-1 )
{
MessageBox((LPCTSTR)CString("关机失败!"));
}
}
void CCloseComputerDlg::OnBnClickedButtonC1()
{
// TODO: 在此添加控件通知处理程序代码
c_v_time=this->V_TIME.Format("%H%M%S");
if(V_CHECK1||V_CHECK2||V_CHECK3||V_CHECK4||V_CHECK5||V_CHECK6||V_CHECK7)
{
(CButton *)GetDlgItem(IDC_BUTTON_C1)->EnableWindow(0);
(CButton *)GetDlgItem(IDC_BUTTON_C2)->EnableWindow(0);
(CButton *)GetDlgItem(IDC_BUTTON_C3)->EnableWindow(0);
(CButton *)GetDlgItem(IDC_BUTTON_C4)->EnableWindow(0);
}
else
{
MessageBox((LPCTSTR)CString("请选择要关机的时间!"));
}
}
4.初始化部分代码
CCloseComputerDlg::CCloseComputerDlg(CWnd* pParent )
: CDialog(CCloseComputerDlg::IDD, pParent)
, V_CHECK1(FALSE), V_CHECK2(FALSE), V_CHECK3(FALSE), V_CHECK4(FALSE), V_CHECK5(FALSE), V_CHECK6(FALSE), V_CHECK7(FALSE)
, V_TIME(0)
, V_TIME_SHOW(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//初始化时间控件
this->V_TIME=CTime::GetCurrentTime();
c_v_time=this->V_TIME.Format("%H%M%S");
this->V_TIME_SHOW=this->V_TIME.Format("%Y-%m-%d %H:%M:%S");
v_result=0;
v_cweek=false;
}
5.头文件部分的代码
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonC2();
afx_msg void OnBnClickedButtonC1();
private:
BOOL V_CHECK1;
BOOL V_CHECK2;
BOOL V_CHECK3;
BOOL V_CHECK4;
BOOL V_CHECK5;
BOOL V_CHECK6;
BOOL V_CHECK7;
public:
CTime V_TIME;
afx_msg void OnTimer(UINT_PTR nIDEvent);
public:
//关机结果
int v_result;
//当前时间
CString c_v_time;
//当天是否需要关机
bool v_cweek;
CString V_TIME_SHOW;
afx_msg void OnDestroy();
afx_msg void OnBnClickedButtonC3();