vc控制计算机关机,VC++实现自动关机

一、关机核心类

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值