【问题标题】:Firemonkey in Delphi XE5. How to create popup menu for my icon in the tray?Delphi XE5 中的 Firemonkey。如何为托盘中的图标创建弹出菜单?
【发布时间】:2014-07-11 00:47:23
【问题描述】:

注意到这一点 - FireMonkey tray icon with a menu

但是这个话题根本没有帮助。

我做了一个功能,我的程序可以最小化到托盘(靠近时钟的角落),但我不明白如何为其执行弹出菜单(可以通过右键单击托盘图标出现) .我尝试了很多例子,但没有任何效果。

这是我的代码:

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;

【问题讨论】:

  • 你为什么不用TTrayIcon?它有一个 PopupMenu 属性
  • @jason 我猜是因为它是一个 vcl 组件
  • 对。 Firemonkey 中没有这样的组件。

标签: delphi winapi firemonkey delphi-xe5


【解决方案1】:

您使用了错误的窗口句柄。而不是

Wnd:= FmxHandleToHWND(self.Handle);

你需要

Wnd:= TrayWnd;

您还应该从TrayWndProc 中删除message WM_ICONTRAY。它在 FMX 的上下文中毫无用处,只会令人困惑。

【讨论】:

  • 谢谢!我还删除了if Message.MSG = WM_ICONTRAY 条件,现在它可以工作了!但现在我还有一个奇怪的问题:弹出菜单出现在带有托盘图标的菜单后面(在 Windows 7 上)。我做了一些截图来解释我的意思:i.imgur.com/mYmjT3a.pngi.imgur.com/NQsxgWV.png我该如何解决?
  • 还有一个错误:如果托盘图标不在菜单中而是在时钟附近(like this),则右键单击它根本不起作用(菜单不出现):(
  • 删除if Message.MSG = WM_ICONTRAY 是错误的做法。如果你这样做,我帮不了你。
  • 我运行我的程序但没有删除它,但没有任何效果。然后我试图删除这个条件并且发生了一些变化。如果你认为我做错了事,我总是可以把代码带回来(我已经这样做了)。但是你有什么建议呢?不删除 if Message.MSG = WM_ICONTRAY 没有任何效果(再次)。顺便说一句,对不起我的英语。那不是我的母语。
  • 看不到完整的程序时很难帮上忙,唯一的诊断是“它不起作用”。
猜你喜欢
  • 2013-02-02
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2018-01-13
相关资源
最近更新 更多