【问题标题】:Delphi "Tray" icon (NotifyIcon) context-menu does not disappear when clicking outside itDelphi“托盘”图标(NotifyIcon)上下文菜单在外部单击时不会消失
【发布时间】:2010-11-14 09:43:43
【问题描述】:

我试图在右键单击我的通知图标时显示一个弹出菜单,效果很好;但我希望当用户在该菜单之外单击时菜单消失。

这应该是按照KB135788 - PRB: Menus for Notification Icons Do Not Work Correctly 设计的(archive)

但我所知道的没有像样的应用程序的行为。我尝试使用弹出菜单的句柄调用 SetForegroundWindow 无济于事。我确信可以解决这个问题,就像我几年前所做的那样,但不记得如何了。

有人知道如何实现预期的行为吗?

【问题讨论】:

    标签: delphi systray


    【解决方案1】:

    我找到了解决办法!

    我在打电话 SetForegroundWindow(PopupMenu1.Handle);

    这不起作用,但在 OnPopup 事件处理程序中将其更改为

    procedure TForm1.PopupMenu1Popup(Sender: TObject);
    begin
      // Hack to fix the "by design" behaviour of popups from notification area icons. 
      // See: http://support.microsoft.com/kb/135788
      BringToFront();
    end;
    

    有效!

    显然,如果在调用它时表单是可见的,那么您的应用程序将跳到最前面,但如果它是隐藏的(就像我的那样),那么它就会工作。

    不过,我很想知道是否有一种方法可以使菜单正常工作而不会跳到最前面。

    【讨论】:

    • SetForegroundWindow 调用不起作用的原因是您给它一个 menu 句柄而不是 window 句柄。它们不可互换。你应该只使用Handle(又名Self.Handle)。
    • 同意。在我所有的系统托盘应用程序中,我使用 SetForegroundWindow() 在显示弹出菜单之前聚焦 TForm。在弹出菜单关闭后,我也会向 TForm 发出 WM_NULL 消息。
    • 从未检查过 SetForegroundWindow 状态,让它静默失败?
    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 2014-09-29
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多