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);
4

2 回答 2

1

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

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

于 2009-12-07T09:29:30.827 回答
0

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

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

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

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

于 2009-12-07T14:38:27.450 回答