(中行雷威2018.3.12)
(同一个世界,同一个梦想,交流学习C++Builder XE10,传承c++builder的魅力!欢迎各地朋友加入我的QQ群484979943,进群密码“BCB”,同时也请将该群号广为宣传,希望能够广集各方高手,共同进步。如需下载开发工具及源代码请加入我的QQ群)
【阅读倡议】
1、有问题请留言;
2、没问题请点赞;
3、看连载请加群;
4、下源码请加群;
【开发工具】
1、C++Builder10.2.2tokyo
本文介绍如何利用WINDOWS封装的API接口实现定时关机、注销、重启和关电。
一、功能设计
新建C++BuilderApplication项目,在主窗口FormAutoShutdown上放置几个按钮,分别是定时关机、重新启动、注销登录、强制关机。再放一个Timer控件,Timer控件每秒循环一次,判断时间,自动关机。
二、代码实现
1、新定义一个preProcess函数
UnitAutoShutdown.h文件:
//---------------------------------------------------------------------------
#ifndef UnitAutoShutdownH
#define UnitAutoShutdownH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Buttons.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TFormAutoShutdown : public TForm
{
__published: // IDE-managed Components
TBitBtn *BitBtn1;
TBitBtn *BitBtn2;
TTimer *Timer1;
TImage *Image1;
TEdit *Edit1;
void __fastcall BitBtn1Click(TObject *Sender);
/*自定义*/
void __fastcall preProcess();//关机预处理
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall BitBtn2Click(TObject *Sender);
void __fastcall FormActivate(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TFormAutoShutdown(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TFormAutoShutdown *FormAutoShutdown;
//---------------------------------------------------------------------------
#endif
UnitAutoShutdown.cpp文件:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
int autoShutCount=20;
#include "UnitAutoShutdown.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormAutoShutdown *FormAutoShutdown;
//---------------------------------------------------------------------------
__fastcall TFormAutoShutdown::TFormAutoShutdown(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormAutoShutdown::BitBtn6Click(TObject *Sender)
{
//重新登录
preProcess();
ExitWindowsEx(EWX_LOGOFF,0);
}
//---------------------------------------------------------------------------
//void __fastcall TFormAutoShutdown::BitBtn5Click(TObject *Sender)
{
//强制关机
preProcess();
ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);
}
//---------------------------------------------------------------------------
void __fastcall TFormAutoShutdown::BitBtn1Click(TObject *Sender)
{
//正常关闭
preProcess();
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
}
//---------------------------------------------------------------------------
void __fastcall TFormAutoShutdown::BitBtn1Click(TObject *Sender)
{
//重新启动
preProcess();
ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);
}
//---------------------------------------------------------------------------
void __fastcall TFormAutoShutdown::preProcess()
{
//关机预处理
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
}
//-----------------------------------------------------------------------------
void __fastcall TFormAutoShutdown::Timer1Timer(TObject *Sender)
{
//定时关机调度
Edit1->Text="警告:您的电脑将在:"+String(autoShutCount--)+" 秒后关机!";
if(autoShutCount==0)
{
BitBtn1->Click();
}
}
//---------------------------------------------------------------------------
void __fastcall TFormAutoShutdown::BitBtn2Click(TObject *Sender)
{
Timer1->Enabled=false;
this->Close();
}
//---------------------------------------------------------------------------
void __fastcall TFormAutoShutdown::FormActivate(TObject *Sender)
{
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------