[英]C++ Windows System Tray wont display message
我已經在這里停留了4天。 我做了一個將程序放入系統托盤的函數,但是這里的問題是它不會顯示氣球標題和消息 。 我究竟做錯了什么? 我什至提供了一個單獨的函數來確定我們正在運行哪些windows os
,並根據檢測到的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);
}
我將NIF_INFO
添加到uFlags
,問題消失了。 現在,它將顯示所有內容,包括文本,標題和信息標題。 下面的代碼解決了它。
iData.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP|NIF_SHOWTIP|NIF_INFO;
問題中的代碼最大的問題是傳遞了錯誤的窗口句柄。 您必須通過您的窗口句柄之一。 但是,您可以傳遞桌面的窗口句柄。
您將需要創建一個窗口並使用其句柄。 該窗口不需要是可見的。 我相信您可以使用“僅消息”窗口。
你還必須調用NIM_SETVERSION
后NIM_ADD
。
我非常懷疑您的版本切換基於字符串相等性測試。 例如,您的代碼將在Windows 9上中斷。 使用版本幫助器功能 。
您也不會執行任何錯誤檢查。 這不是最容易調用的函數,但是如果您無法檢查錯誤,則會使事情變得比原本更難做。 請閱讀文檔並添加錯誤檢查代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.