我在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);
答案 0 :(得分:1)
您正在尝试在资源管理器完全启动之前创建图标。您应该handle errors gracefully(向下滚动到“处理Shell_NotifyIcon失败”)。
您还应该处理TaskbarCreated notification - 它可以让您在资源管理器崩溃并重新启动后重新创建图标。
答案 1 :(得分:0)
问题是由于启动期间当前目录不是可执行文件所在的目录而引起的。
因此,getCurrentDir实际上在启动时以及在任何其他时间运行应用程序时返回不同的目录。
我的应用程序假设当前目录是可执行文件所在的目标。
这个假设导致应用程序永远不会到达添加代码的托盘图标。一旦我修复了目录问题,代码就会运行并正确创建图标。