Delphi实现通用的定时自动关机程序

Delphi实现通用的定时自动关机程序,第1张

Delphi实现通用的定时自动关机程序,第2张

1.提出问题:如果在无人值班的情况下,运行某项任务的电脑,尤其是服务器,能够在到达规定时间时自动关机,将大大减轻系统管理员的负担,给我们的日常工作带来极大的便利。

作者用Delphi开发的这个定时自动关机程序适用于两种Windows操作系统:从Windows 95/98/Me到Windows NT/2000/XP。

第二,程序的功能是:

1.用户自行设置关机时间,通过自定义函数IsValidTime()判断用户输入的时间是否有效。

2.定时强制自动关机:对于windows 95/98/Me,直接调用API函数ExitWindowsEx()关机。对于NT/2000/XP,需要获取计算机名,获得关机权限后才能关机:首先调用OpenProcessToken()函数获取访问令牌的句柄,然后调用AdjustTokenPrivileges()函数启用该权限。Win32API定义了一组字符串常量来标识不同的特权,比如关机特权‘seshutdownprivilege’。

3.当设定的关机时间到达时,延迟30秒,以便用户保存文件或取消关机。当两个操作系统都显示倒计时时,对于windows 95/98/Me,只通过程序界面显示;对于NT/2000/XP,将显示呼叫系统的倒计时界面。

4.为了不占用任务栏的空空间,程序显示在托盘中。右键单击托盘中的图标,将显示快捷菜单。

5.如果没有达到设定的关机时间,系统将会关机,程序可以拦截关机消息,用户可以选择是否关机。原理:当用户关闭Windows时,系统会给每个应用程序发送一个消息wm_queryendsession,告诉每个应用程序它要关闭了。如果反馈信息值为0,则不能关闭。所以,拦截wm_queryendsession,反馈0,就大功告成了。

6.在内存中只运行这个程序的一个实例。原理:这个功能是利用Windows的全局原子表信息实现的。所有当前应用程序都可以访问Windows的全局原子表,它总共可以包含37个项目。程序运行时,首先检查表格中是否有该程序的信息,如果有,则提示并退出。如果没有,请在表格中添加该程序的信息。当程序最终退出时,应该从表中删除信息,以便程序可以再次运行。

四。源程序:

单元自动关闭1;
接口

使用
窗口、消息、系统工具、变体、类、图形、控件、表单、
对话框、StdCtrls、ExtCtrls、菜单、AppEvnts、shellapi。
type
t form 1 = class(t form)
timer 1:TTimer;
timer 2:TTimer;
application events 1:TApplicationEvents;
popup menu 1:TPopupMenu;
edit 1:TEdit;
edit 2:TEdit;
label 1:t label;
label 2:t label;
label 3:t label;
Btn _ OK:TButton;
Btn _ Abort:TButton;
过程定时器1Timer(发送方:to object);
procedure tray menu(Var Msg:t message);消息WM _ USER
过程times etclick(Sender:to object);
过程ExitClick(发送方:to object);
procedure Btn_OKClick(发送方:to object);
过程Btn_AbortClick(发送方:to object);
过程Timer2Timer(发送方:to object);
过程编辑2按键(发送方:TObjectvar键:Char);
过程WMQueryEndSession(var Msg:TWMQueryEndSession);
message WM _ QueryEndSession;
过程FormCreate(发件人:to object);
过程FormDestroy(发送方:to object);
过程FormCloseQuery(发件人:TObjectvar can close:Boolean);
private
{私有声明}
Tray:NOTIFYICONDATA;
过程show intray();
Public
{ Public declarations }
end;

var
form 1:t form 1;
P,Ti1:Pchar;
Flags:Longint;
i:整数;
{关机延迟时间}
TimeDelay:整数;
atom:integer;
实现
{$R *。dfm}

{当系统在自动关机时间之前即将关机时,拦截关机消息。

Wm_queryendsession,允许用户决定是否关闭}
proceduretform 1 . wmqueryendsession(var msg:twmqueryendsession);
begin
if messagedlg('您真的要关闭Windows吗?,mtConfirmation,[mbYes,mbNo],0) = mrNo then
Msg。结果:= 0
else
Msg。结果:= 1;
end;

{判断时间格式是否有效}

function is valid time(s:string):bool;
begin
if Length(s)5 then is valid time:= False
else
begin
if(s[1]' 2 ')or(s[2]' 9 ')or(s[3]':')or
(s[4]' 5 ')or
(s[5]' 9 ')then is valid time:= False
else
is valid time:= True;
end;
end;


{确定哪种操作系统决定关机模式}

函数GetOperatingSystem:string;
var osVerInfo:tosversion info;
begin
Result:= ' ';
osverinfo . dwosversioninfosize:= SizeOf(TOSVersionInfo);
if GetVersionEx(osVerInfo)then
case osVerInfo . dwplatformid of
VER _平台_ WIN32 _ NT:
begin
Result:= ' Windows NT/2000/XP '
end;
VER _平台_ WIN32 _ WINDOWS:
begin
Result:= ' WINDOWS 95/98/98SE/Me ';
end;
end;
end;


{获取计算机名}

函数get computer name:string;
var
buffer: array[0..MAX _ computer name _ LENGTH+1];
大小:枢机主教;
begin
Size:= MAX _ computer name _ LENGTH+1;
Windows。GetComputerName(@buffer,Size);
Result:= strpas(buffer);
end;


{定时关机功能,各参数的含义如下:

计算机:计算机名;Msg:显示提示信息;
Time:延时;强制:是否强制关机;
Reboot:是否重新启动}
函数定时器hutdown(computer:string;Msg:字符串;
时间:WordForce:布尔型;Boolean):Boolean;
var
rl:枢机主教;
hToken:红衣主教;
tkp:TOKEN _ PRIVILEGES;
begin
{获取用户关机权限,仅适用于Windows NT/2000/XP }
open process Token(getCurrentProcess,token _ adjust _ privileges或token _ query,hto ken);
if LookupPrivilegeValue(nil,' SeShutdownPrivilege ',tkp。权限[0]。Luid)然后
开始
tkp。权限[0]。属性:= SE _ PRIVILEGE _ ENABLED
tkp。PrivilegeCount:= 1;
AdjustTokenPrivileges(hToken,False,tkp,0,nil,rl);
end;
Result:= initiatesystemshut down(PChar(Computer),PChar(Msg),Time,Force,Reboot)
end;

{窗体最小化后,将显示在任务栏中}

程序tform1。ShowInTray
Begin
Tray . cbsize:= sizeof(Tray);
托盘。Wnd:=Self。手柄;
tray . u flags:= NIF _ ICON+NIF _ MESSAGE+NIF _ TIP;
tray . ucallbackmessage:= WM _ USER;
Tray.hIcon:=application。图标。句柄;
Tray.szTip:= '定时关机';
Shell_NotifyIcon(NIM_ADD,@ Tray);
End;

{右键单击托盘中的图标以显示快捷菜单}

程序Tform1。tray menu(var Msg:t message);
var
X,Y:t point;
J,K:整数;
Begin
GetCursorPos(X);
GetCursorPos(Y);
J:= X . X;
K:= Y . Y;
如果消息。LParam=WM_RBUTTONDOWN然后弹出菜单1。Popup(J,K);
End;

过程TForm1。Timer1Timer(发送方:to object);
开始
编辑1。Text:=FormatDateTime('hh:mm ',Now);
{两个时间相等,计算机将在TimeDelay的秒内强制关机}
if edit 1 . text = edit 2 . text then
begin
time delay:= 30;
定时器1。enabled:= False;
如果getOperatingSystem = ' Windows NT/2000/XP '那么
begin
{调用系统的关机提示窗口,仅适用于Windows NT/2000/XP。}
Timeds Hutdown(get computer name,'系统将被关闭!',
TimeDelay,true,false);
btn_abort。enabled:= true;
定时器2。enabled:= true;
end;
如果GetOperatingSystem = ' Windows 95/98/98SE/Me ',则
开始
定时器2。enabled:= true;
{在顶层显示此程序的窗口,显示时间倒计时}
应用程序。还原;
SetWindowPos(Handle,HWND_MOST,Left,Top,Width,Height,
SWP _ no activate);
end;
end;
end;

程序TForm1。Timer2Timer(发送方:to object);
begin
btn_abort。enabled:= true;
label3。Caption := '在关闭时间之前还有'+inttostr(timedelay)+'秒。';
如果timedelay>0,则timedelay:=timedelay-1
否则
开始
定时器2。enabled:= false;
{强制关闭Windows 95/98/98SE/Me }
exitwindowex(ewx _ shut down+ewx _ force,0);
end;
end;

{由控制弹出菜单1定义的快捷菜单包括“设置关机时间”和“退出”。

PopupMenu1的AutoPopup为False,这里是“设置关机时间”的代码)}
proceduretform 1 . times etclick(sender:to object);
begin
{在顶层设置此程序窗口}
SetWindowPOS (handle,hwnd _ most,left,top,width,height,
SWP _ no activate);
ShowWindow(应用程序。手柄,SW _ NORMAL);
编辑2。SetFocus
编辑2。选择全部;
end;

{快捷菜单中“退出”的代码}

程序TForm1。ExitClick(发送方:to object);
begin
{如果已经开始倒计时,禁止退出,但会显示程序窗口}
如果timer2.enabled = false则
begin
application . termin ate;
end
else ShowWindow(应用程序。手柄,SW _ NORMAL);
end;

{确定按钮}

程序TForm1。Btn_OKClick(发送方:to object);
begin
btn_abort。enabled:= false;
label3。标题:= '提示:关机时间格式HH:MM ';
如果定时器1。Enabled =false,则定时器1。enabled:= true;
{如果关机时间设置有效,程序会显示在任务栏中;如果无效,会给出提示。}
if IsValidTime(edit2。Text)然后
开始
ShowWindow(应用程序。Handle,SW _ minimize);
ShowWindow(应用程序。Handle,SW _ hide);
show intray;
end
else
show message('提示:时间格式错误,'+chr(13)+
'请输入正确的关机时间HH:mm . ');
end;

{取消关机按钮}

程序TForm1。Btn_AbortClick(发送方:to object);
begin
if get operating system = ' Windows NT/2000/XP ' then
{对于Windows NT/2000/XP,取消关机}
begin
中止系统关机(pchar(get computer name)
end;
{当倒计时停止时}
如果定时器2。enabled = truethentimer2。enabled:= false;
btn_abort。enabled:= false;
end;

{输入关机时间后,直接回车}

程序TForm1。Edit2KeyPress(发送方:TObjectvar键:Char);
begin
if(key = # 13)then Btn _ OK。点击;
end;

{搜索系统原子表,查看程序是否已经运行}

程序TForm1。FormCreate(发件人:to object);
begin
{如果程序没有运行,则在表中添加信息}
If GlobalFindatom(' program _ running ')= 0 then
Atom:= GlobalDDATOM(' program _ running ')
Else begin
{如果程序已经在运行,则显示一条消息,然后退出}
MessageDlg('程序已经在运行!',mtWarning,[mbOK],0);
暂停;
end;
end;

程序TForm1。FormDestroy(发送方:to object);
begin
{程序退出时,从原子表中删除信息}
GlobalDeleteTom(atom);
{删除托盘中的图标}
shell _ notifyicon(nim _ Delete,@ tray);
end;

程序TForm1。FormCloseQuery(发件人:TObjectvar can close:Boolean);
begin
{如果已经开始倒计时,禁止关闭程序窗口}
如果timer2.enabled = true则可以关闭:= false
end;
结束。

动词 (verb的缩写)描述:本程序在Windows XP下用Delphi 6.0开发,在Windows 95/98/Me和Windows NT/2000/XP下运行成功。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » Delphi实现通用的定时自动关机程序

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情