system-tray - NOTIFYICONDATA - GUID 问题

标签 system-tray

根据 http://msdn.microsoft.com/en-us/library/bb773352(v=vs.85).aspx 处 NOTIFYICONDATA 结构的 guidItem 成员的描述使用 Windows 系统托盘的程序需要在 Windows 7 上使用有效的 GUID 标识其图标。我这样做了,但遇到了问题。如果我的应用程序在目录 A 中运行,然后用户在某个时候决定移动它并在目录 B 中运行它,当程序调用 Shell_NotifyIcon 时它失败(返回 0),GetLastError 设置为 1460(ERROR_TIMEOUT)。

如果您在 MSDN 文章的最底部进一步阅读故障排除点 2,它基本上描述了使用 GUID 识别其系统托盘图标的程序无法更改路径,否则会发生这种情况。然后它还有这个有趣的小简介:

If the path must be changed, the application should remove any GUID information that was added when the existing icon was registered.



有谁知道 Win32 API 调用或执行此操作的方法?据推测,这将是一个采用我想要删除的 GUID 的函数,调用它会删除 Windows 识别为使用此 GUID 的任何 exe 的任何设置。如果是这样,我可以设置我的程序以尝试调用 Shell_NotifyIcon,然后如果失败,我将调用一个函数来清除所有内容并重试。

我能想到的允许可能需要在多个位置(而不是同时)运行的程序为其系统托盘图标使用相同的 GUID 的唯一其他选项是暴力修改设置根据这篇文章注册:http://deployment.xtremeconsulting.com/2011/07/08/windows-7-notification-area-automation-falling-back-down-the-binary-registry-rabbit-hole/如果可能,我想避免这种方法,原因很明显。

对此问题的任何帮助将不胜感激。

最佳答案

这是我所知道的可能性的完整列表:

  • 使用有效证书签署您的 EXE;
  • 永远不要移动 EXE(排除可移植程序);
  • 不要为通知图标分配 GUID,
  • hacky approach you linked to ,
  • 根据您的应用程序路径生成 GUID。

  • 让我们来看看最后一个想法,特别是。 Windows 希望每个路径都有一个唯一的 GUID。我们只想要一个只要路径固定就不会改变的 GUID。这实际上是微不足道的。这是一个大纲:
  • 使用类似 make a guid 的服务生成随机 GUID
  • 获取您的可执行路径
  • 使用至少输出 128 位的散列函数散列您的路径,例如 MD5 或 SHA-1
  • 将您的 GUID 与路径哈希进行异或,截断为 128 位
  • 使用结果作为托盘图标 GUID

  • 这带来了一个问题:应用程序路径不一定是唯一的。但这不应该是一个主要问题,因为首先,大多数时候它是独一无二的,其次,如果通过替代路径运行,最糟糕的情况是用户将不得不重新定位托盘图标一次。

    关于system-tray - NOTIFYICONDATA - GUID 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7432319/

    相关文章:

    C++系统托盘唯一程序

    c++ - 系统托盘应用 Linux Qt/C++

    带有 controlsfx 通知组件的 javafx NullPointerException

    java - 如何防止 TrayIcon 弹出窗口占用整个调度程序线程

    c# - 带有 c# 控制台应用程序的系统托盘图标不会显示菜单

    c# - 将文本而不是图标写入系统托盘

    java - 单击十字时在系统托盘中添加 jframe,而不是在最小化按钮的情况下添加 jframe

    python-3.x - Python 3 Wx 更改托盘图标

    c# - 开发 Sharepoint Windows 窗体

    java - 系统托盘弹出带有图像的菜单项(菜单项的图标)