【问题标题】:Can't set correct Tray Icon in Visual C++ using LoadIcon()无法使用 LoadIcon() 在 Visual C++ 中设置正确的托盘图标
【发布时间】:2014-02-23 14:56:02
【问题描述】:

所以我有一个没有控制台的程序。它首先创建一个虚拟 HWND,然后将其隐藏,然后充当通知区域应用程序(留在托盘中)。人们可以将鼠标悬停在程序上以查看其状态并按热键在屏幕上执行任务。

无论如何,我想在托盘中显示我的程序图标但不能。我将图标资源添加到 Visual Studio,我的可执行文件在资源管理器中有一个图标。资源的大小为 16x16 - 256x256。

现在,我将 NOTIFYICONDATA 的信息设置为: nid.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON1));

并包含“resource.h”

将 IDI_ICON1 定义为 104。但是,当我使用它时,会出现蓝色的解释点图标(即 Windows 默认图标之一)。我尝试了 IDI_ERROR 并且错误图标显示正常。我尝试了一个自定义的 12x12 图标,因为我阅读尺寸可能是问题,但这也不起作用。

IDI_APPLICATION 使用应用程序的默认图标,即默认的.exe 图标。

我目前不知道该尝试或做什么。

提前感谢您的帮助!

【问题讨论】:

  • 从不在使用原始 winapi 时跳过错误检查。至少使用 assert() 来验证您的假设。您现在会看到 LoadIcon() 失败。
  • 是的,你是对的。我不熟悉这个任务栏相关的 API,所以我做了一些检查。

标签: c++ icons system-tray notifyicon tray


【解决方案1】:

LoadIcon() 的一篇 MSDN 文章谈到了它的第一个论点:

模块实例的句柄,其可执行文件包含要加载的图标。加载标准图标时,此参数必须为 NULL。

由于您加载的不是标准图标,而是您自己的,因此您需要提供一个有效的模块句柄。可以通过将NULL 传递给GetModuleHandle() 函数来检索可执行文件的模块句柄,因此代码如下所示:

nid.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1));

【讨论】:

  • 是的,你是对的。所以我错误地假设 NULL 是一个 NULL 句柄,我需要使用 GetModuleHandle(NULL)。谢谢!
猜你喜欢
  • 2012-06-04
  • 1970-01-01
  • 2011-05-20
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多