C ++ Windows系统托盘不会显示消息

时间:2014-06-28 05:55:40

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

我被困在这里4天了。我创建了一个将程序放入系统托盘的功能,但问题是不会显示气球标题和消息。我究竟做错了什么?我甚至做了一个单独的函数来确定我们正在运行的windows os并根据检测到的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);
}

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

您还必须在NIM_SETVERSION之后致电NIM_ADD

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

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