Delphi XE5中的Firemonkey。如何在托盘中为我的图标创建弹出菜单?
注意到这一点- 但这个话题毫无帮助 我做了一个功能,我的程序可以最小化到托盘(靠近时钟的一个角落),但我不知道如何为它执行弹出菜单(可以通过右键单击托盘图标显示)。我试了很多例子,但都不管用 这是我的密码:Delphi XE5中的Firemonkey。如何在托盘中为我的图标创建弹出菜单?,delphi,winapi,firemonkey,delphi-xe5,Delphi,Winapi,Firemonkey,Delphi Xe5,注意到这一点- 但这个话题毫无帮助 我做了一个功能,我的程序可以最小化到托盘(靠近时钟的一个角落),但我不知道如何为它执行弹出菜单(可以通过右键单击托盘图标显示)。我试了很多例子,但都不管用 这是我的密码: unit MainCode; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Graphics, FMX.C
unit MainCode;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Edit, FMX.Objects, FMX.ListBox, WinApi.ShellApi, WinApi.Windows, WinApi.Messages, FMX.Platform.Win, FMX.Menus, FMX.Platform;
const
WM_ICONTRAY = WM_USER + 1;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
MenuItem1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MenuItem1Click(Sender: TObject);
private
TrayWnd: HWND;
TrayIconData: TNotifyIconData;
TrayIconAdded: Boolean;
procedure TrayWndProc(var Message: TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
TrayWnd := AllocateHWnd(TrayWndProc);
with TrayIconData do
begin
cbSize := SizeOf();
Wnd:= TrayWnd; // was before Wnd:= FmxHandleToHWND(self.Handle);
uID:= 0;
uFlags:= NIF_MESSAGE + NIF_ICON + NIF_TIP;
uCallbackMessage:= WM_ICONTRAY;
hIcon:= GetClassLong(FmxHandleToHWND(self.Handle), GCL_HICONSM);
szTip:= 'Hearthspinner';
end;
if not TrayIconAdded then
TrayIconAdded := Shell_NotifyIcon(NIM_ADD, @TrayIconData);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if TrayIconAdded then
Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
DeallocateHWnd(TrayWnd);
end;
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
Application.Terminate;
end;
上面的代码运行良好。下一个代码不起作用:
procedure TForm1.TrayWndProc(var Message: TMessage);
var P: TPoint;
begin
if Message.MSG = WM_ICONTRAY then
begin
case Message.LParam of
WM_RBUTTONDOWN:
begin
GetCursorPos(P);
PopupMenu1.Popup(P.X,P.Y);
end;
end;
end
else
Message.Result := DefWindowProc(TrayWnd, Message.Msg, Message.WParam, Message.LParam);
end;
您使用了错误的窗口句柄。而不是
Wnd:= FmxHandleToHWND(self.Handle);
你需要
Wnd:= TrayWnd;
您还应该从
TrayWndProc
中删除消息WM\u ICONTRAY
。在FMX的背景下,它没有任何作用,只是混淆了 为什么不使用TTrayIcon?它有一个弹出菜单property@jason我猜是因为它是vcl组件,对吧。Firemonkey中没有这样的组件。谢谢!我还删除了if Message.MSG=WM_ICONTRAY
条件,现在它可以工作了!但现在我还有一个奇怪的问题:弹出菜单出现在带有托盘图标的菜单后面(在Windows7上)。我做了一些截图来解释我的意思:如何修复它?还有一个错误:如果托盘图标不在菜单中,而是在时钟附近出现(),那么右键单击它根本不起作用(菜单不出现):(删除if Message.MSG=WM_ICONTRAY
是错误的做法。如果您这样做,我将无法帮助您。我在没有删除此项的情况下运行我的程序,但再次没有任何效果。然后我尝试删除此条件,并更改了某些内容。如果您认为我这样做是错误的,我始终可以将代码带回来(我已经这样做了).但是你有什么建议吗?如果Message.MSG=WM_ICONTRAY不删除,那么就什么都不起作用了(再次)。顺便说一句,对不起,我的英语不是我的母语。当我看不到完整的程序时,很难帮上忙,唯一的诊断是“它不起作用”。