【问题标题】:System Tray Icon not appearing on startup系统托盘图标在启动时未出现
【发布时间】:2009-12-07 08:10:22
【问题描述】:

我在 FormCreate 事件处理程序中使用以下代码来创建系统托盘图标。当我运行我的程序时,系统托盘图标显示正常。

我将我的应用程序设置为在 Windows 启动时自动启动。当我重新启动计算机时,我的应用程序进程已启动,但系统托盘图标从未出现。

我认为这可能与代码运行的时间有关,可能系统托盘还没有准备好填充。

我的应用程序在启动时通过它的 NSIS 安装程序运行: WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "MyApp" "$INSTDIR\ MyApp.exe"

创建系统托盘图标的代码:

with TrayIconData do
  begin
    cbSize := SizeOf(TrayIconData);
    Wnd := Handle;
    uID := 0;
    uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
    uCallbackMessage := WM_ICONTRAY;
    hIcon := Application.Icon.Handle;
    StrPCopy(szTip, Application.Title);
  end;

  Shell_NotifyIcon(NIM_ADD, @TrayIconData);

【问题讨论】:

    标签: delphi startup system-tray


    【解决方案1】:

    您正在尝试在 Explorer 完全启动之前创建图标。你应该handle errors gracefully(向下滚动到“处理 Shell_NotifyIcon 失败”)。

    您还应该处理TaskbarCreated notification——它使您能够在资源管理器崩溃和重新启动后重新创建您的图标。

    【讨论】:

    • 感谢您提供有用的信息。我已经按照建议处理了一个带有睡眠和重试的 shell_NotifyIcon,但无济于事。我将继续搜索信息,并在确定具体案例中的问题后接受答案。
    • 没有关于Handling Shell_NotifyIcon failure here @RogerLipscombe 的这一段,你有另一个关于失败细节的链接吗?我和 OP 有同样的问题:stackoverflow.com/questions/45255294/… 并且没有成功。我已经尝试过TaskbarCreated 等,但它没有改变任何东西:每 3、4 或 5 次启动一次,系统托盘图标就不会出现。
    【解决方案2】:

    问题是因为启动过程中的当前目录不是可执行文件所在的目录。

    所以 getCurrentDir 实际上在启动时返回不同的目录,以及在任何其他时间运行应用程序时。

    我的应用程序错误地假设当前目录是可执行文件所在的目录。

    这种假设导致应用根本无法到达托盘图标添加代码。一旦我修复了目录问题,代码就会运行并正确创建图标。

    【讨论】:

    • 我今天也有同样的问题。为什么当前目录会更改有关 systrayicon 的任何内容?你能解释更多吗?您正在从可执行文件内部加载图标,对吗?那么,为什么当前目录很重要?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多