2009-12-07 50 views
4

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

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

我认为它可能是做的代码在运行时的时间,也许在系统托盘还没有准备好进行填充。

我得到我的应用程序运行在启动时通过它的NSIS安装: WriteRegStr HKLM “软件\微软\的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); 

回答

1

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

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

+0

感谢您的有用信息。我已经处理了一个睡眠shell_NotifyIcon并按照建议重试,无济于事。我将继续搜索信息,并在我解决具体情况下的问题时接受答案。 – SamH 2009-12-07 12:29:04

+0

“处理Shell_NotifyIcon失败”[这里](http://msdn.microsoft.com/en-us/library/bb762159.aspx)@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 2017-07-22 21:55:11

0

问题是由于启动过程中的当前目录不是可执行程序所在的目录而导致的。

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

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

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

+0

今天我有同样的问题。为什么当前目录改变了有关systrayicon的任何内容?你能解释更多吗?您正在从可执行文件中加载图标,对吗?那么,为什么当前的DIRI重要? – Basj 2017-07-22 21:52:40