【问题标题】:Why Shell_NotifyIcon not showing balloon notification?为什么 Shell_NotifyIcon 不显示气球通知?
【发布时间】:2021-10-14 18:30:10
【问题描述】:

我编写了一个示例应用程序来查看如何将气球通知添加到 Win32 应用程序。有人可以指出为什么Shell_NotifyIcon() 没有显示气球通知吗? GetLastErrorShell_NotifyIcon() 返回 2147500037

#include <Windows.h>
#include "shellapi.h"

int main()
{
    NOTIFYICONDATA nid;
    nid.cbSize = sizeof(NOTIFYICONDATAA_V3_SIZE);
    nid.uTimeout = 500;
    nid.uID = 1;
    nid.uFlags = NIF_TIP | NIF_ICON | NIF_MESSAGE | NIF_INFO | 0x00000080;
    nid.uCallbackMessage = WM_USER + 200;
    nid.hIcon = LoadIcon(NULL, IDI_INFORMATION);
    lstrcpy(nid.szTip, L"Test Tip");
    lstrcpyW(nid.szInfoTitle, L"Test Title");
    Shell_NotifyIcon(NIM_ADD, &nid); //GetLastError returns - 2147500037

    return 0;
 }

【问题讨论】:

  • Shell_NotifyIcon() 没有记录使用GetLastError() 进行错误报告,因此您不能依赖GetLastError() 在这种情况下返回任何有意义的内容。

标签: c++ winapi visual-c++


【解决方案1】:

应该使用NOTIFYICONDATA_V3_SIZE 而不是NOTIFYICONDATAA_V3_SIZE,因为您清楚地使用Unicode(从lstrcpyWL"..." 可以看出),并且您使用默认的NOTIFYICONDATA

应该只使用nid.cbSize = NOTIFYICONDATA_V3_SIZE;nid.cbSize = sizeof(NOTIFYICONDATA),你不希望有整数常量的大小。

在调用GetLastErrror之前还应该检查Shell_NotifyIcon结果,如果不是FALSEGetLastError不相关。

【讨论】:

  • 对我不起作用。更新代码:nid.cbSize = sizeof(NOTIFYICONDATA_V3_SIZE);
  • 刚刚注意到你有 sizeof 用于已经是大小的整数常量,你不需要sizeof
  • 对于 Unicode 应该是 NOTIFYICONDATAW 和 Shell_NotifyIconW
  • 更新了代码,还是不行 - pastebin.pl/view/66ec03aa
  • 您还缺少 HWND 来接受您的消息,并且不要将未初始化的字段归零 szInfodwStatedwStateMask。 (如果您至少将其设置为零,它可能在没有HWND 的情况下工作)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多