Windows关闭时怎样使程序自动关闭? windows正常关闭的时候会给所有的未关闭程序发送关闭的消息。所以你处理自己的正常关闭消息就好。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵,在delphi中你可以在Onclose和OnCloseQuery中处理关闭事件。具体区别请自己查看帮助。windows发送的消息应该是WM_CLOSE吧 to gaoys1979(虫洞):我的程序是一个通过internet传图片的,我关机时,其他程序都关了,它动都不动,每次都拔电源. procedure WMQueryEndSession(var Message: TMessage); message WM_QUERYENDSESSION;procedure TForm1.WMQueryEndSession(var Message: TMessage);begin Message.Result := 1; FormDestroy(nil); RecordLog(DateTimeToStr(Now) + ' 关闭或重新启动计算机'); Application.Terminate;end;增加这个就可以了!! 响应 WM_QUERYENDSESSION 消息 procedure WMQueryEndSession (var Message: TMessage); message WM_QUERYENDSESSION ; Message.Result := 1;如果返回0,表明不能关闭 控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数首先定义常数constEWX_FORCE=4; //关闭所有程序并以其他用户身份登录EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式EWX_REBOOT=2; //重新启动计算机EWX_SHUTDOWN=1;//关闭计算机运行时给How赋值,让他等于EWX_SHUTDOWN或其他,调用以下语句ExitWindowsEx(How,0);///////////////////////////////////////////Function ShutDownWindows(Flags: Byte) : Boolean;begin Result := ExitWindowsEx(Flage, 0) // 如果成功返回 True.end;Flags可用参数:EWX_LOGOFF: (=0) 安全地关闭所有进程,并关闭用户登录。EWX_SHUTDOWN: (=1) 关闭系统。所有缓冲区的内容都能被安全的存盘,所有进程都将被停止。 对于Windows NT: 必须有 SE_SHUTDOWN_NAME 的安全特权方可进行此项操作。 对于Windows 95: 不必有任何特权。EWX_REBOOT: (=2) 关闭并重新启动系统。 对于Windows NT: 必须有 SE_SHUTDOWN_NAME 的安全特权方可进行此项操作。 对于Windows 95: 不必有任何特权。EWX_FORCE: (=4) 强制切断连接,关闭所有应用程序。当使用这个参数时,Windows 将不向正在运行的应用程序发送 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息,有可能造成数据丢失。所以推荐只在紧急时使用这个参数。EWX_POWEROFF: (=8) 关闭系统并切断电源,需要ATX电源支持。/////////////////////////////////////unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } procedure AdjustToken; public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}procedure TForm1.AdjustToken();var hdlProcessHandle : Cardinal; hdlTokenHandle : Cardinal; tmpLuid : Int64; tkpPrivilegeCount : Int64; tkp : TOKEN_PRIVILEGES; tkpNewButIgnored : TOKEN_PRIVILEGES; lBufferNeeded : Cardinal; Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;begin hdlProcessHandle := GetCurrentProcess; OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle); // Get the LUID for shutdown privilege. LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid); Privilege[0].Luid := tmpLuid; Privilege[0].Attributes := SE_PRIVILEGE_ENABLED; tkp.PrivilegeCount := 1; // One privilege to set tkp.Privileges[0] := Privilege[0]; // Enable the shutdown privilege in the access token of this // process. AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Sizeof(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded); end;procedure TForm1.Button1Click(Sender: TObject);begin AdjustToken; ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), $FFFF);end;end. 关于DLL中类型转化的问题,C++中的Set怎么在Delphi中使用啊!!高手帮帮 求delphi7函数大全 FastReport打印问题?急,但不是很难! StringGrid的问题。。。 小弟初学Delphi,有个关于TStringList的问题请教大家 delphi中数据控键显示数据是小数问题 求助!! 请问如何实现“宏”? 不是分少是问题简单! Delphi7的编辑器如何让代码后退和前进? 请问如何同时打印单行记录和打印多行记录而使用同一个QuickReport? 我在做毕业设计,有没有朋友做过人事管理系统的给予帮助!! 给予重谢!!!!
具体区别请自己查看帮助。
windows发送的消息应该是WM_CLOSE吧
begin Message.Result := 1;
FormDestroy(nil);
RecordLog(DateTimeToStr(Now) + ' 关闭或重新启动计算机');
Application.Terminate;end;增加这个就可以了!!
procedure WMQueryEndSession (var Message: TMessage); message WM_QUERYENDSESSION ;
Message.Result := 1;
如果返回0,表明不能关闭
首先定义常数
const
EWX_FORCE=4; //关闭所有程序并以其他用户身份登录
EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式
EWX_REBOOT=2; //重新启动计算机
EWX_SHUTDOWN=1;//关闭计算机
运行时给How赋值,让他等于EWX_SHUTDOWN或其他,调用以下语句
ExitWindowsEx(How,0);///////////////////////////////////////////
Function ShutDownWindows(Flags: Byte) : Boolean;
begin
Result := ExitWindowsEx(Flage, 0)
// 如果成功返回 True.
end;Flags可用参数:EWX_LOGOFF:
(=0)
安全地关闭所有进程,并关闭用户登录。EWX_SHUTDOWN:
(=1)
关闭系统。所有缓冲区的内容都能被安全的存盘,所有进程都将被停止。
对于Windows NT: 必须有 SE_SHUTDOWN_NAME 的安全特权方可进行此项操作。
对于Windows 95: 不必有任何特权。EWX_REBOOT:
(=2)
关闭并重新启动系统。
对于Windows NT: 必须有 SE_SHUTDOWN_NAME 的安全特权方可进行此项操作。
对于Windows 95: 不必有任何特权。EWX_FORCE:
(=4)
强制切断连接,关闭所有应用程序。当使用这个参数时,Windows 将不向正在运行的应用程序发送 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息,有可能造成数据丢失。所以推荐只在紧急时使用这个参数。EWX_POWEROFF:
(=8)
关闭系统并切断电源,需要ATX电源支持。
/////////////////////////////////////
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject); private
{ Private declarations }
procedure AdjustToken;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}procedure TForm1.AdjustToken();
var
hdlProcessHandle : Cardinal;
hdlTokenHandle : Cardinal;
tmpLuid : Int64;
tkpPrivilegeCount : Int64;
tkp : TOKEN_PRIVILEGES;
tkpNewButIgnored : TOKEN_PRIVILEGES;
lBufferNeeded : Cardinal;
Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
begin
hdlProcessHandle := GetCurrentProcess;
OpenProcessToken(hdlProcessHandle,
(TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),
hdlTokenHandle); // Get the LUID for shutdown privilege.
LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
Privilege[0].Luid := tmpLuid;
Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1; // One privilege to set
tkp.Privileges[0] := Privilege[0];
// Enable the shutdown privilege in the access token of this
// process.
AdjustTokenPrivileges(hdlTokenHandle,
False,
tkp,
Sizeof(tkpNewButIgnored),
tkpNewButIgnored,
lBufferNeeded); end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AdjustToken;
ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_REBOOT), $FFFF);
end;end.