我被困在这里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);
}
答案 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。
您也不会执行错误检查。这不是最容易调用的函数,但是如果不能检查错误会使事情变得比他们需要的更难。请阅读文档并添加错误检查代码。