系统托盘图标在启动时未显示

4
我在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);
2个回答

1

您正在尝试在资源管理器完全启动之前创建图标。您应该优雅地处理错误(向下滚动到“处理Shell_NotifyIcon失败”)。

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


感谢提供有用的信息。我已经按照建议使用sleep和retry处理了shell_NotifyIcon,但仍然没有效果。我将继续寻找信息,并在解决我的特定问题后接受答案。 - SamH
这里没有关于“处理Shell_NotifyIcon失败”的段落@RogerLipscombe,你有另一个链接提供更多关于失败的细节吗?我和OP一样遇到了同样的问题:https://stackoverflow.com/questions/45255294/rare-error-on-tray-icon-creation-after-a-user-log-out-log-in,但是没有成功。我已经尝试过`TaskbarCreated`等方法,但是没有改变任何东西:每3、4或5次启动中,系统托盘图标都不会出现。 - Basj

0

问题是由于启动时的当前目录不是可执行文件所在的目录导致的。

因此,在启动时,getCurrentDir实际上返回的是不同的目录,而在其他任何时间运行应用程序时则不是这样。

我的应用程序做出了错误的假设,即当前目录将是可执行文件所在的目录。

这种假设导致应用程序永远无法到达托盘图标添加代码。 一旦我解决了目录问题,代码就运行并正确地创建了图标。


我今天也遇到了同样的问题。为什么当前目录会影响到系统托盘图标?您能否多加解释一下?您是从可执行文件内部加载图标吗?那么,为什么当前目录很重要呢? - Basj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接