【问题标题】:C++ Windows System Tray wont display messageC ++ Windows系统托盘不会显示消息
【发布时间】:2014-06-28 05:55:40
【问题描述】:

我在这里被困了 4 天。我做了一个将程序放在系统托盘中的函数,但这里的问题是它不会显示气球标题和消息。我究竟做错了什么?我什至制作了一个单独的函数来确定我们正在运行的windows os,并根据检测到的操作系统初始化cbSize。任何帮助将不胜感激。下面是函数。

编辑:我正在使用Windows 7,图标显示在系统托盘中,但不会显示消息或标题。我现在也在做这个控制台应用程序,因为它将用作Unity3D 中的插件。我想要一个使用 windows api 但不使用 windows 窗体的解决方案,因为我不希望从中打开任何新窗口。

void createSystemTray()
{
    HWND wHandler = GetDesktopWindow();
    NOTIFYICONDATA iData;
    ZeroMemory(&iData,sizeof(iData));



    if(getOsVersion()=="Windows Vista" || getOsVersion()=="Windows 7" || getOsVersion()=="Windows 8" || getOsVersion()=="Windows 8.1")
    {
        iData.cbSize = sizeof(NOTIFYICONDATA);
    }

    else if (getOsVersion()=="Windows XP"||getOsVersion()=="Windows XP Professional x64 Edition")
    {
        iData.cbSize = NOTIFYICONDATA_V3_SIZE;
    }

    else if (getOsVersion()=="Windows 2000")
    {
        iData.cbSize = NOTIFYICONDATA_V2_SIZE;
    }

    else if (getOsVersion()=="UNKNOWN OS")
    {
//Assume we have old Windows Os such as Me,95....
        iData.cbSize = NOTIFYICONDATA_V1_SIZE;
    }
    iData.hWnd = wHandler;
    iData.uID = 100;
    iData.uVersion = NOTIFYICON_VERSION_4;
    iData.uCallbackMessage = WM_MESSAGE;
    iData.hIcon = LoadIcon(NULL,(LPCTSTR)IDI_WARNING);
    lstrcpy(iData.szTip,"My First Tray Icon");
    lstrcpy(iData.szInfo,"My App Info");
    lstrcpy(iData.szInfoTitle,"My Info Title");
    iData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
    Shell_NotifyIcon(NIM_SETVERSION,&iData); //called only when usingNIM_ADD
    Shell_NotifyIcon(NIM_ADD,&iData);
}

【问题讨论】:

  • 您不需要为 Vista 或更高版本添加 uFlag NIF_SHOWTIP 吗?
  • 我添加了 #define NIF_SHOWTIP 0x00000080 然后将 NIF_SHOWTIP 添加到 uFlags 但仍然无法正常工作。
  • 您的应用是否有启用 ComCtl v6 的清单?
  • 不需要清单。它适用于 Windows 7,并且在台式计算机上运行,​​而不是在移动设备、Windows 8 或 Android 上运行。

标签: c++ winapi system console-application system-tray


【解决方案1】:

我在uFlags 中添加了NIF_INFO,问题就消失了。现在它显示所有内容,包括文本、标题和信息标题。 下面的代码就是解决它的原因。

iData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_SHOWTIP|NIF_INFO;

【讨论】:

    【解决方案2】:

    问题中代码的最大问题是您传递了错误的窗口句柄。您必须通过您的窗口句柄之一。但是,您传递的是桌面的窗口句柄。

    您需要创建一个窗口并使用它的句柄。窗口不需要可见。我相信您可以使用仅消息窗口。

    您还必须在NIM_ADD 之后调用NIM_SETVERSION

    我非常怀疑您的版本切换是否基于字符串相等测试。例如,您的代码将在 Windows 9 上中断。使用version helper functions

    您也不会执行任何错误检查。这不是最容易调用的函数,但是您未能检查错误会使事情变得比需要的更难。请阅读文档并添加错误检查代码。

    【讨论】:

    • 我这样做了,但是没有用。经过长时间的研究并尝试了 11 个小时的运气后,我想通了。我所做的只是将 NIF_INFO 添加到 uFlags 中。感谢您的帮助,您提供的 Windows 版本链接非常棒。
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多