TrayIcon 不显示通知

TrayIcon doesn't show notification

我使用此代码来显示 TrayIcon 它可以工作并且 TrayIcon 出现在系统托盘中但它不显示 BalloonHint;我尝试更改一些设置,但它仍然没有显示通知

procedure TMainForm.FormCreate(Sender: TObject);
begin
  TrayIcon1.Hint := 'Hint';
  TrayIcon1.AnimateInterval := 200;
  TrayIcon1.BalloonTitle := 'Hint';
  TrayIcon1.BalloonHint := 'Double click to restore Application';
  TrayIcon1.BalloonFlags := bfInfo;
end;

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

procedure TMainForm.TrayIcon1DblClick(Sender: TObject);
begin
  TrayIcon1.Visible := False;
  Show();
  WindowState := wsNormal;
  Application.BringToFront();
end;

这段代码有什么问题?


项目原来是用Delphi7写的,现在升级到DelphiXE8了。

你需要做一些不同的事情。首先,您需要检查表单何时最小化。这可以通过捕获消息 WM_SIZE

来完成
procedure WMSize(var Msg: TMessage); message WM_SIZE;

然后:

procedure TForm1.WMSize(var Msg: TMessage);
begin
  if Msg.WParam  = SIZE_MINIMIZED then ....
end;

通常您还需要关闭按钮来最小化应用程序。这可以通过实施 CloseQuery 事件来实现。

我已经根据你自己的代码做了一个小例子。

首先是DFM代码:

object Form11: TForm11
  Left = 0
  Top = 0
  Caption = 'Form11'
  ClientHeight = 299
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCloseQuery = FormCloseQuery
  OnCreate = FormCreate
  OnHide = FormHide
  PixelsPerInch = 96
  TextHeight = 13
  object TrayIcon1: TTrayIcon
    OnDblClick = TrayIcon1DblClick
    Left = 312
    Top = 152
  end
  object PopupMenu1: TPopupMenu
    Left = 184
    Top = 112
    object Close1: TMenuItem
      Caption = 'Close'
      Default = True
      OnClick = Close1Click
    end
  end
end

那么实际的源代码:

unit Unit11;

interface

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

type
  TForm11 = class(TForm)
    TrayIcon1: TTrayIcon;
    PopupMenu1: TPopupMenu;
    Close1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Close1Click(Sender: TObject);
    procedure TrayIcon1DblClick(Sender: TObject);
  private
    AllowClose: Boolean;
  public
    procedure WMSize(var Msg: TMessage); message WM_SIZE;
  end;

var
  Form11: TForm11;

implementation

{$R *.dfm}

procedure TForm11.Close1Click(Sender: TObject);
begin
  AllowClose := True;
  Close;
end;

procedure TForm11.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := AllowClose;
  if not AllowClose then
    Hide;
end;

procedure TForm11.FormCreate(Sender: TObject);
begin
  AllowClose := false;
  TrayIcon1.Hint := 'Hint';
  TrayIcon1.AnimateInterval := 200;
  TrayIcon1.BalloonTitle := 'Hint';
  TrayIcon1.BalloonHint := 'Double click to restore Application';
  TrayIcon1.BalloonFlags := bfInfo;
end;

procedure TForm11.FormHide(Sender: TObject);
begin
  TrayIcon1.Visible := True;
  TrayIcon1.Animate := True;
  TrayIcon1.ShowBalloonHint;
end;

procedure TForm11.TrayIcon1DblClick(Sender: TObject);
begin
  TrayIcon1.Visible := false;
  Show();
  WindowState := wsNormal;
  Application.BringToFront();
end;

procedure TForm11.WMSize(var Msg: TMessage);
begin
  if Msg.WParam = SIZE_MINIMIZED then
    Close;
end;

end.

代码没有问题。 这似乎是你 Notification Area Icons 的 OS 级别设置错误 (= Hide icon and notifications)。 为您的申请打开 Control Panel\All Control Panel Items\Notification Area Icons 和 select Only show notificationsShow icon and notifications

代码没有问题,看起来windows有问题
重新安装 windows 已修复

为了当前和未来的互联网搜索者,我会说我的问题是 XE5 和 Windows 10(它在 Windows XP 中运行良好)。结果是我愚蠢地打开了优先级模式,它隐藏了通知……还有 trayicon 的气球提示。