我写Indy UDP 写了一个程序,不知道怎么会引起无法正常关机! 我查了,我也想了很多办法:
1 在 QueryEndSession (Msg.Result :=1),
WMEndSession (Message.EndSession :=True;) 事件里有响应,
而在 QueryClose,Close 却没有响应。 2 如果在WMEndSession 执行 Application.Termination 或 Close,
程序关掉了,关机程序却停止执行了!
1.主窗体 QueryEndSession, QueryClose,Close 事件都作了正确设置!
2.在KeyPressDown 下屏蔽了 ALT+F4
各位同仁,给点意见^_^!
1 在 QueryEndSession (Msg.Result :=1),
WMEndSession (Message.EndSession :=True;) 事件里有响应,
而在 QueryClose,Close 却没有响应。 2 如果在WMEndSession 执行 Application.Termination 或 Close,
程序关掉了,关机程序却停止执行了!
1.主窗体 QueryEndSession, QueryClose,Close 事件都作了正确设置!
2.在KeyPressDown 下屏蔽了 ALT+F4
各位同仁,给点意见^_^!
后来发现是因为对queryendsession消息处理后,第一次只会关闭程序。
procedure WMQueryEndsession(Var Msg:TMessage);Message WM_QueryEndSession;procedure Tclient.WMQueryEndsession(var Msg: TMessage);
begin
Msg.Result := 1;
close; //将自己的程序关闭
end;
如果还有问题 你在CLOSEQUERY事件中手动释放INDY控件看看。
var EWX_SHUTDOWN,EWX_FORCE:integer;
VerInfo: TOSVersionInfo;
hToken: THANDLE;
tkp: TOKEN_PRIVILEGES;
Nothing: Cardinal;begin
EWX_SHUTDOWN:=1;
EWX_FORCE:=4;begin
VerInfo.dwOSVersionInfoSize := SizeOf(VerInfo);
GetVersionEx(VerInfo);
if VerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken);
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, tkp, 0, nil, Nothing);
end;
ExitWindowsEx(EWX_FORCE + EWX_SHUTDOWN + EWX_POWEROFF, 0);
end;EXITWINDOWSEX(EWX_POWEROFF,0);
EXITWINDOWSEX(EWX_FORCE OR EWX_SHUTDOWN,0);
end;