处理 Windows NotificationIcons 使用的 GUID 的正确方法

2024-03-19

微软文档如下:

通过验证是否只有单个应用程序注册使用 GUID 指定的通知图标,可以防止欺骗。第一次调用 Shell_NotifyIcon(NIM_ADD, ...) 时执行此注册,并存储调用应用程序的完整路径名。如果您稍后将二进制文件移动到其他位置,系统将不允许再次添加图标。请参阅 Shell_NotifyIcon 了解更多信息。

自文档于Shell_NotificyIcon https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shell_notifyicona关于如何再次注销GUID的内容相当稀疏,出现以下问题:当我再次卸载相应的应用程序时,如何正确删除NotificationIcon?

有描述的蛮力方法here https://answers.microsoft.com/en-us/windows/forum/all/how-to-remove-old-notification-icons-from-the/c66892b4-51a9-44fa-853f-b17cdff5ed2f,这会删除所有系统图标,并且必须再次重新启动进程 explorer.exe。不过我想知道是否存在更准时的方法。

另外一个选择 https://stackoverflow.com/questions/7432319/notifyicondata-guid-problem每次用户安装应用程序或将其移动到新位置时,都会创建一个新的 GUID。这被认为是最佳实践吗?


微软员工 10 年前的回答 https://social.msdn.microsoft.com/Forums/en-US/08591224-9719-4f39-8413-8d650d199260/how-do-i-unregister-a-notify-icons-guidbinary-pair?forum=windowsgeneraldevelopmentissues谈到更改路径时可能的解决方法,同时声称无法取消注册:

没有提供取消注册的方法。如果您的二进制文件经过 Authenticode 签名,则注册可以随应用程序一起移动。请参阅 NOTIFYICONDATA 文档中的故障排除部分。

注意 当原始二进制文件和移动的二进制文件均由同一家公司进行 Authenticode 签名时,移动文件的唯一例外情况会发生。在这种情况下,设置将在移动过程中保留。

当为要更新的路径创建图标时,两个二进制文件需要同时存在。

我个人从不使用GUID,我只是使用Win95 中的经典ID 模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理 Windows NotificationIcons 使用的 GUID 的正确方法 的相关文章

  • 屏幕截图忽略了一些窗口

    我正在 MFC 中工作 我正在尝试捕获桌面的 bmp 我正在使用 GetDC NULL 来执行此操作 但它似乎忽略了特殊的皮肤窗口 它似乎忽略了用 UpdateLayeredWindow 绘制的窗口 此行为似乎仅发生在 Vista x64
  • 使用 StretchDIBits 使用 Delphi 6 处理条形码图像 - 输出中缺少条形线

    我的应用程序是在 Delphi 6 中开发的 由于后台处理和大量数据 它消耗大约 60MB 120MB 物理内存 这是一个资源密集型应用程序 该应用程序的功能之一是在进行某些处理后创建条形码图像 如果用户继续生成条形码 那么至少十分之一的条
  • 如何在Windows上用C语言实现定时器

    如何在 C 中创建一个计时器 时间到期后 我应该能够调用回调函数 平台是windows 有人可以指导我吗 问候 米敦 看一眼SetTimer http msdn microsoft com en us library ms644906 28
  • VirtualAlloc 对齐方式与分配大小一致吗?

    当使用VirtualAlloc用于分配和提交具有页面边界的两倍大小的虚拟内存区域的 API 例如 void address VirtualAlloc 0 0x10000 MEM COMMIT PAGE READWRITE Get 64KB
  • 监控进程的网络使用情况?

    C 或 C C Win32 中有没有一种方法可以监视某个进程的网络使用情况 显然没有您构建的应用程序 我想只监视 1 个进程大约一个小时左右 然后返回仅该进程 例如 Limewire 使用的字节 是否可以 我知道 Windows 上的 ne
  • 获取保证具有完整(4 位)年份的 LOCALE_SSHORTDATE 的正确方法是什么?

    我想创建一个日期时间选择器控件 它显示日期和时间 作为DTS SHORTDATECENTURYFORMAT and DTS TIMEFORMAT风格 由于日期时间选择器中没有内置这种样式 因此我必须自己做GetLocaleInfoEx 我注
  • 使用 CreateRestrictedToken(LUA_TOKEN) 从提升的进程创建低/中进程

    我正在尝试从提升的进程创建中或低完整性进程 我知道还有其他类似的问题 但它们主要关注使用资源管理器或任务计划程序等解决方法 我想坚持使用CreateRestrictedToken CreateProcessAsUser 我认为一定可以以某种
  • 创建具有特定权限的线程C++

    我有一个多线程应用程序 我想创建一个具有不同用户权限的线程 例如 多域管理员权限 但我找不到任何 Win32 APICreateThread要做到这一点 如何创建具有特定用户权限的线程 thanks 调用 CreateThread CREA
  • 如何使用 C++ 禁用另一个进程中窗口上的关闭按钮?

    我需要从另一个进程禁用窗口上的关闭按钮 我有它的句柄hWnd我尝试这样做 DWORD dwCStyle GetClassLongPtr hWnd GCL STYLE SetClassLongPtr hWnd GCL STYLE dwCSty
  • 使用 BitBlt 捕获程序窗口始终返回相同的图像

    我编写了以下代码 C Win32 来捕获游戏窗口屏幕并从图像中获取像素颜色数组 函数 autoB 完成这项工作 然后我将结果数组绘制到窗口中以直观地检查我得到的结果 问题是 这个程序在我启动计算机后只工作一次 在第一次 缓存 从游戏中获取的
  • C# 如何使用 CallNtPowerInformation 和 Interop 来获取 SYSTEM_POWER_INFORMATION

    我正在尝试编写一个小程序 该程序作为服务运行并监视用户是否处于活动状态 如果用户空闲 没有鼠标 键盘 一个小时 则某些进程将被终止 如果用户使用 user32 dll 中的 LASTINPUTINFO 运行它 它就可以工作 但它不能作为服务
  • 在运行时,我如何判断我是否在 WinXP+ 上? win32

    我正在进行一些 win32 字符串 API 调用 并假设字符串以宽字符串形式出现 这在 XP 和更高版本上有效 我该如何断言这一点 这是运行时检查还是编译时检查 我做错了吗 这是一个例子 typedef std basic string
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • 通过win32检测多个登录用户

    使用标准 win32 api 检测多个用户登录的最佳方法是什么 我对我们的软件产品进行了升级 当多个用户登录时 该产品无法运行 我知道这是应该避免的事情 因为它很烦人 但该产品非常复杂 您必须相信我 当我说确实没有其他解决方案时 谢谢 为了
  • 如果加载 dll 找不到依赖项,有什么方法可以捕获错误吗?

    我正在编写一个 Windows 32 位程序 可以使用多个可能的 dll 之一 所以它尝试依次加载每个 dll 使用SysUtils SafeLoadLibrary如果加载成功 它就会使用该 dll 不幸的是 其中一些 dll 静态链接到其
  • P/invoke 函数采用指向结构的指针[重复]

    这个问题在这里已经有答案了 功能如创建进程 http msdn microsoft com en us library ms682425 VS 85 aspx有带有指向结构的指针的签名 在C中我会通过NULL作为可选参数的指针 而不是在堆栈
  • 构建适用于 Windows 8 的控制面板小程序

    我开发了一个控制面板小程序 cpl 文件 我们与我们的应用程序一起分发 它在所有以前版本的 Windows 上运行良好 但在 Windows 8 上不行 该小程序根本不显示在控制面板中 以前我们所要做的就是将 cpl 文件放入 system
  • Java - 使用 JNA 的 Windows 任务栏 - 如何将窗口图标 (HICON) 转换为 java 图像?

    我正在尝试将应用程序切换器添加到我正在处理的更大项目中 它需要在 Windows XP Vista 7 8 上运行 我正在使用 Java 1 7 下面是我创建的一个示例应用程序 用于演示我遇到的一些问题 我对 JNA 很陌生 非常感谢 充满
  • 如何在 Perl 中修改 Windows NTFS 权限?

    我在 Windows Server 2003 上使用 ActiveState Perl 我想在 Windows NTFS 分区上创建一个目录 然后授予 Windows NT 安全组对该文件夹的读取访问权限 这在 Perl 中可能吗 我必须使
  • 如何在 C++ 中使用 LoadLibrary(..) 调用 kernel32.dll 函数 GetTickCount()

    我正在寻找一个在 Windows 机器上获取以毫秒为单位的时间的函数 本质上 我想调用这个 WinAPI 函数 GetTickCount 但我陷入了 使 用 LoadLibrary n 调用 GetTickCount 函数 部分 我搜索了每

随机推荐