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不删除
,那么就什么都不起作用了(再次)。顺便说一句,对不起,我的英语不是我的母语。当我看不到完整的程序时,很难帮上忙,唯一的诊断是“它不起作用”。