问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

那位大哥能给我delphi自动关机代码

发布网友 发布时间:2024-10-10 00:33

我来回答

2个回答

热心网友 时间:2024-11-14 02:19

源程序: unit AutoShut1;
interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus,AppEvnts,shellapi;
type
TForm1 = class(TForm)
Timer1: TTimer;
Timer2: TTimer;
ApplicationEvents1: TApplicationEvents;
PopupMenu1: TPopupMenu;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Btn_OK: TButton;
Btn_Abort: TButton;
procedure Timer1Timer(Sender: TObject);
procedure TrayMenu(Var Msg:TMessage); message WM_USER;
procedure TimeSetClick(Sender: TObject);
procedure ExitClick(Sender: TObject);
procedure Btn_OKClick(Sender: TObject);
procedure Btn_AbortClick(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure WMQueryEndSession (var Msg : TWMQueryEndSession);
message WM_QueryEndSession;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
Tray:NOTIFYICONDATA;
procedure ShowInTray();
public
{ Public declarations }
end; var
Form1: TForm1;
P,Ti1:Pchar;
Flags:Longint;
i:integer;
{关机延迟时间}
TimeDelay:integer;
atom:integer;
implementation
{$R *.dfm} {未到自动关机时间,系统要关闭时,截获关机消息 wm_queryendsession,让用户决定是否关机}
procedure TForm1.WMQueryEndSession (var Msg : TWMQueryEndSession);
begin
if MessageDlg(’真的要关闭Windows吗?’,mtConfirmation,[mbYes,mbNo], 0) = mrNo then
Msg.Result := 0
else
Msg.Result := 1;
end; {判断时间S格式是否是有效} function IsValidTime(s:string):bool;
begin
ifLength(s)<>5 then IsValidTime:=False
else
begin
if(s[1]<’0’)or(s[1]>’2’)or(s[2]<’0’)or
(s[2]>’9’) or (s[3] <> ’:’) or
(s[4]<’0’) or (s[4]>’5’) or
(s[5]<’0’) or (s[5]>’9’)then IsValidTime:=False
else
IsValidTime:=True;
end;
end;
{判断是哪类操作系统,以确定关机方式} function GetOperatingSystem: string;
varosVerInfo: TOSVersionInfo;
begin
Result :=’’;
osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
if GetVersionEx(osVerInfo) then
case osVerInfo.dwPlatformId of
VER_PLATFORM_WIN32_NT:
begin
Result := ’Windows NT/2000/XP’
end;
VER_PLATFORM_WIN32_WINDOWS:
begin
Result := ’Windows 95/98/98SE/Me’;
end;
end;
end;
{获得计算机名} function GetComputerName: string;
var
buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: Cardinal;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
Windows.GetComputerName(@buffer, Size);
Result := strpas(buffer);
end;
{定时关机函数 ,各参数的意义如下: Computer: 计算机名;Msg:显示的提示信息;
Time:时间延迟; Force:是否强制关机;
Reboot: 是否重启动}
function TimedShutDown(Computer: string; Msg: string;
Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
{获得用户关机特权,仅对Windows NT/2000/XP}
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
if LookupPrivilegeValue(nil, ’SeShutdownPrivilege’, tkp.Privileges[0].Luid) then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
end;
Result := InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot)
end; {窗体最小化后,显示在托盘中} procedure tform1.ShowInTray;
Begin
Tray.cbSize:=sizeof(Tray);
Tray.Wnd:=Self.Handle;
Tray.uFlags:=NIF_ICON+NIF_MESSAGE+NIF_TIP;
Tray.uCallbackMessage:=WM_USER;
Tray.hIcon:=application.Icon.Handle ;
Tray.szTip:=’定时关机’;
Shell_NotifyIcon(NIM_ADD,@Tray);
End; {右键单击托盘中的图标,显示快捷菜单} procedure Tform1.TrayMenu(var Msg:TMessage);
var
X,Y:Tpoint;
J,K:Integer;
Begin
GetCursorPos(X);
GetCursorPos(Y);
J:=X.X;
K:=Y.Y;
if Msg.LParam=WM_RBUTTONDOWN then PopupMenu1.Popup(J,K);
End; procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text:=FormatDateTime(’hh:mm’, Now);
{两个时间相等,计算机将在TimeDelay秒内强制关机}
if edit1.text=edit2.Text then
Begin
TimeDelay:=30;
timer1.Enabled:=False;
if GetOperatingSystem=’Windows NT/2000/XP’ then
begin
{调用系统的关机提示窗口,只限于Windows NT/2000/XP。}
TimedShutDown(getcomputername, ’系统将要关机!’,
TimeDelay, true, false);
btn_abort.Enabled :=true;
timer2.Enabled :=true;
end;
ifGetOperatingSystem=’Windows 95/98/98SE/Me’ then
begin
timer2.Enabled :=true;
{在顶层显示本程序的窗口,显示时间倒记时}
Application.Restore;
SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,
SWP_NOACTIVATE);
end;
end;
end; procedure TForm1.Timer2Timer(Sender: TObject);
begin
btn_abort.Enabled :=true;
label3.Caption :=’离关机时间还有’+inttostr(timedelay)+’秒。’;
if timedelay>0 then timedelay:=timedelay-1
else
begin
timer2.Enabled :=false;
{强制Windows 95/98/98SE/Me关机}
ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE,0);
end;
end; {通过控件PopupMenu1定义的快捷菜单,包括"设置关机时间"和"退出"。 PopupMenu1的AutoPopup为False,下面是"设置关机时间"的代码}
procedure TForm1.TimeSetClick(Sender: TObject);
begin
{设置本程序窗口位于最顶层}
SetWindowPos(Handle,HWND_TOPMOST,Left,Top,Width,Height,
SWP_NOACTIVATE);
ShowWindow(Application.Handle,SW_NORMAL);
edit2.SetFocus ;
edit2.SelectAll ;
end; {快捷菜单中"退出"的代码} procedure TForm1.ExitClick(Sender: TObject);
begin
{如果已经开始倒记时,禁止退出,而是显示程序窗口}
if Timer2.Enabled=false then
begin
Application.Terminate;
end
elseShowWindow(Application.Handle,SW_NORMAL);
end; {确定按钮} procedure TForm1.Btn_OKClick(Sender: TObject);
begin
btn_abort.Enabled :=false;
label3.Caption :=’提示:关机时间格式 HH:MM’;
if timer1.Enabled =false then timer1.Enabled :=true;
{关机时间设置有效,程序将显示在托盘中,无效则提示。}
if IsValidTime(edit2.Text) then
begin
ShowWindow(Application.Handle,sw_minimize);
ShowWindow(Application.Handle,sw_hide);
ShowInTray;
end
else
showmessage(’提示:时间格式错误,’+chr(13)+
’请输入正确的关机时间 HH:MM。’);
end; {取消关机按钮} procedure TForm1.Btn_AbortClick(Sender: TObject);
begin
ifGetOperatingSystem=’Windows NT/2000/XP’ then
{对于Windows NT/2000/XP,取消关机}
begin
AbortSystemShutdown(pchar(getcomputername));
end;
{停止倒记时}
if timer2.Enabled =true then timer2.Enabled :=false;
btn_abort.Enabled :=false;
end; {输入关机时间后,可直接按回车} procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if (key=#13)thenBtn_OK.Click;
end; {搜寻系统原子表看是否程序已运行} procedure TForm1.FormCreate(Sender: TObject);
begin
{如果没运行则在表中增加信息 }
if GlobalFindAtom(’PROGRAM_RUNNING’) = 0 then
atom := GlobalAddAtom(’PROGRAM_RUNNING’)
else begin
{如果程序已运行则显示信息然后退出 }
MessageDlg(’程序已经在运行!’,mtWarning,[mbOK],0);
Halt;
end;
end; procedure TForm1.FormDestroy(Sender: TObject);
begin
{程序退出时,从原子表中移走信息}
GlobalDeleteAtom(atom);
{删除托盘中的图标}
Shell_NotifyIcon(NIM_DELETE,@Tray);
end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
{如果已经开始倒记时,禁止关闭程序窗口}
if timer2.Enabled =true then canclose:=false;
end;
end.

看看 这个是否能用 可以定时关机的

热心网友 时间:2024-11-14 02:13

在windows xp下可以通过调用shutdown.exe来实现定时关机。也可以通过ExitWindowsEx来实现关机的任务,不过比较复杂,详细可见我帖在博客上的资料。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
湖北有哪些旅游景点湖北省内旅游攻略 什么露出笑脸什么拟人 句 正方形有几个面几条边 未加工的塑膏注册商标属于哪一类? 夫妻共同生活年限与夫妻共同财产的关系 《民法典》:婚前个人财产如何处置 外阴有白色异物 女性下体瘙痒异味是什么问题 win10开机搜狗输入法不见 2. Linux组件之数据库连接池 怎样用Delphi7.0编关机程序? ...动感地带校园卡为什么就没话费了?是在外地激活的,仅发短信定了些服 ... 急!刚买一张动感地带校园卡,必选了一项10的音乐套餐。但是现在查基本套... 湖南衡阳移动动感地带校园卡是什么概念. 长沙动感地带校园卡手机上网 湖南岳阳动感地带校园卡上网问题 在wps office上写的稿子复制到淘宝上用有人投诉吗? 我有打印的稿子 怎么才能把这些稿子弄成文件 可以在wpsoffice查看 我想... 法硕非法学考研科目都有哪些 法律硕士初试科目是什么 长沙动感地带什么卡最优惠 长沙动感地带手机卡怎样收费的? 宜华企业(集团)有限公司怎么样? 怎样用手机传文件到学习通 湖南移动动感地带是怎样流量计费的?有没有套餐可选? 湖南动感地带网聊套餐是怎样收费的? 湖南动感地带那种套餐最适合拨打长途电话,谢谢 ...拿就离职了,我是2008年退休的,没有医保卡怎么办? 湖南动感地带怎么收费的,长沙地带 快速生发九种小妙招 b2驾驶证醉驾会降级吗? 驾驶证B2,因酒驾被扣半年,扣12分,学习7天考试科目一领回来了,请问降级... 驾驶证因酒驾降级被扣六个月时间到啦怎么办理? 驾驶证被扣六个月到期后怎样办理降级 二七相伴同台走有几个生肖 我动感地带卡,每个月是100M的流量套餐,我没有购买叠加包,可收到信息... ...一个动感地带卡,他说每月最低消费16元送100兆流量还有XX条信息,可是... 动感地带的卡,每月送100M流量和100条免费信息的这个是没月多少钱? 我手机卡是动感地带的为什么我买了5元流量它却加在了省外流量中,而我... ...可为什么每个月查10086都会有一个“套餐费”?这和GPRS上... 刚开了个新卡动感地带,每月送200条短信300M流量他说是9元每月是不是... 医用冻干粉和普通冻干粉的区别是什么? 刚买的车有玻璃水吗 如何阅读并分析上市公司的年度报告 山东三本哪些学校 带爬字的网名 2012超拽女生网名 ubuntu14.04安装MySQL_MySQL ubuntu16.04下mysql的安装和卸载。 ...Shell给Ubuntu Server23.04远程安装MySQL-server8.2