gpt4 book ai didi

Delphi - 防止 Windows 从托盘应用程序关闭

转载 作者:行者123 更新时间:2023-12-02 03:51:21 25 4
gpt4 key购买 nike

我正在尝试为我们的系统制作一个小工具,以防止我们的软件运行时 Windows 关闭。为了使其独立,我制作了一个单独的应用程序,使用this来防止关机。信息。

但是,当应用程序最小化到托盘时,Windows 会简单地杀死它并正常关闭。如果表单可见(又名我注释 Form.OnCreate 事件中的 Application.Minimize 调用),它确实可以防止关闭。

如何实现 MainWindow Hook 以保持事件状态,或者通过其他方式防止系统关闭,并将应用程序隐藏在托盘中?

谢谢。

当前代码:

unit Main;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, TlHelp32, dateutils, Vcl.AppEvnts, Vcl.ExtCtrls;

type
TForm1 = class(TForm)
TrayIcon1: TTrayIcon;
ApplicationEvents1: TApplicationEvents;
procedure FormCreate(Sender: TObject);
function HookEndSession(var Message: TMessage): Boolean;
procedure WMQueryEndSession(var Msg : TWMQueryEndSession) ;
message WM_QueryEndSession;
procedure ApplicationEvents1Minimize(Sender: TObject);
procedure ApplicationEvents1Restore(Sender: TObject);
procedure TrayIcon1DblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var Form1: TForm1;
var Mutex : THandle;

implementation

{$R *.dfm}



procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
Msg.Result := 0;
end;

function TForm1.HookEndSession(var Message: TMessage): Boolean;
begin
result := false;
if Message.Msg = WM_ENDSESSION then begin
Message.Result := 0;
result := true;
end;
end;


procedure TForm1.TrayIcon1DblClick(Sender: TObject);
begin
WindowState := wsNormal;
Application.Terminate;
end;

procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
Hide();
WindowState := wsMinimized;
TrayIcon1.Visible := True;
end;

procedure TForm1.ApplicationEvents1Restore(Sender: TObject);
begin
Application.Minimize;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Mutex := CreateMutex(nil, True, 'preventWinShutdown');
if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then
Application.Terminate;

Application.HookMainWindow(HookEndSession);

TrayIcon1.Hint := 'Windows Shutdown prevented.';
//Application.Minimize;
end;


end.

最佳答案

我手头没有 XE3,但在 XE7 中,TCustomTrayIcon.WindowProc 显式处理 WM_QUERYENDSESSION通过返回 1(相当于 TRUE),向 Windows 发出信号以继续执行注销/关闭/重新启动序列。您可以覆盖它:

type
TTrayIcon = class(Vcl.ExtCtrls.TTrayIcon)
protected
procedure WindowProc(var Message: TMessage); override;
end;

procedure TTrayIcon.WindowProc(var Message: TMessage);
begin
case Message.Msg of
WM_QUERYENDSESSION:
Message.Result := 0;
else
inherited WindowProc(Message);
end;
end;

为了获得更完整的解决方案,您可以在单独的单元中创建一个新类,继承自 TCustomTrayIcon 并重新发布您希望公开的属性和事件,例如 TTrayIcon > 确实,在 IDE 中安装该组件并在您的任何项目中使用它。

上面的示例只是一个带有插入器类的快速示例,您只需在 TForm1 之前声明它并立即使用,仅在本单元中。

关于Delphi - 防止 Windows 从托盘应用程序关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39327091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com