VC++实现自动关机

时间:2022-12-22 05:58:01

 

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();