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 notifications
或 Show icon and notifications
。
代码没有问题,看起来windows有问题
重新安装 windows 已修复
为了当前和未来的互联网搜索者,我会说我的问题是 XE5 和 Windows 10(它在 Windows XP 中运行良好)。结果是我愚蠢地打开了优先级模式,它隐藏了通知……还有 trayicon 的气球提示。
我使用此代码来显示 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 notifications
或 Show icon and notifications
。
代码没有问题,看起来windows有问题
重新安装 windows 已修复
为了当前和未来的互联网搜索者,我会说我的问题是 XE5 和 Windows 10(它在 Windows XP 中运行良好)。结果是我愚蠢地打开了优先级模式,它隐藏了通知……还有 trayicon 的气球提示。