0
我的目標是創建一個shell通知圖標,並在需要時顯示氣球工具提示。我寫了下面的代碼。如何根據需要顯示shell通知圖標氣球工具提示?
bool SystemTrayIcon::Create(const std::wstring & Tip,
HWND hWndParent,
const GUID & Guid,
UINT IdCallback,
HICON hIcon,
TYPE Type,
bool bSound,
bool bSharedIcon,
bool bHidden,
bool bLargeIcon,
bool bRespectQuiteTime)
{
NotifyIconData.cbSize = sizeof(NotifyIconData);
NotifyIconData.hWnd = hWndParent;
NotifyIconData.uID = 0; // Use GUID instead. (NIF_GUID)
NotifyIconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_STATE | NIF_GUID | NIF_REALTIME | NIF_SHOWTIP;
NotifyIconData.uCallbackMessage = IdCallback;
NotifyIconData.hIcon = hIcon;
if (Tip.length() > MAX_TIP)
{
std::wcsncpy(NotifyIconData.szTip, Tip.c_str(), MAX_TIP);
NotifyIconData.szTip[MAX_TIP] = wchar_t(0);
}
else
{
std::wcsncpy(NotifyIconData.szTip, Tip.c_str(), Tip.length() + 1);
}
NotifyIconData.dwState = (bSharedIcon ? NIS_SHAREDICON : 0)
| (bHidden ? NIS_HIDDEN : 0);
NotifyIconData.dwStateMask = NIS_SHAREDICON | NIS_HIDDEN;
NotifyIconData.uVersion = NOTIFYICON_VERSION_4;
DWORD dwType;
switch (Type)
{
case TYPE::STI_INFO:
dwType = NIIF_INFO;
break;
case TYPE::STI_WARNING:
dwType = NIIF_WARNING;
break;
case TYPE::STI_ERROR:
dwType = NIIF_ERROR;
break;
}
NotifyIconData.dwInfoFlags = dwType | NIIF_USER
| (bSound ? 0 : NIIF_NOSOUND)
| (bLargeIcon ? NIIF_LARGE_ICON : 0)
| (bRespectQuiteTime ? NIIF_RESPECT_QUIET_TIME : 0);
NotifyIconData.guidItem = Guid;
return bInitialized = Shell_NotifyIconW(NIM_ADD, &NotifyIconData);
}
void SystemTrayIcon::Balloon( const std::wstring & Title,
const std::wstring & Message,
HICON hBalloonIcon)
{
if (!bInitialized) return;
if (Title.length() > MAX_TITLE)
{
std::wcsncpy(NotifyIconData.szInfoTitle, Title.c_str(), MAX_TITLE);
NotifyIconData.szInfoTitle[MAX_TITLE] = wchar_t(0);
}
else
{
std::wcsncpy(NotifyIconData.szInfoTitle, Title.c_str(), Title.length() + 1);
}
if (Message.length() > MAX_MESSAGE)
{
std::wcsncpy(NotifyIconData.szInfo, Message.c_str(), MAX_MESSAGE);
NotifyIconData.szInfo[MAX_MESSAGE] = wchar_t(0);
}
else
{
std::wcsncpy(NotifyIconData.szInfo, Message.c_str(), Message.length() + 1);
}
NotifyIconData.hBalloonIcon = hBalloonIcon;
NotifyIconData.dwInfoFlags |= NIF_INFO;
Update();
}
void SystemTrayIcon::Update()
{
Shell_NotifyIconW(NIM_MODIFY, &NotifyIconData);
}
我稱這些成員函數中這樣的代碼:在調用Create()
方法之後正確顯示
TrayIcon.Create(/*const std::wstring & Tip*/ L"Tip",
/*HWND hWndParent*/ Window.hWnd,
/*const GUID & Guid*/ GUID {0x7f0f02e3, 0x479b, 0x4a09, {0xbf, 0x99, 0xd3, 0x39, 0xe9, 0x3a, 0x8b, 0x22}},
/*UINT IdCallback*/ ID_TRAYICON,
/*HICON hIcon*/ (HICON) LoadImageW(Status::hInstance, L"icon1.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE),
/*TYPE Type*/ SystemTrayIcon::TYPE::STI_INFO,
/*bool bSound*/ true,
/*bool bSharedIcon*/ false,
/*bool bHidden*/ false,
/*bool bLargeIcon*/ true,
/*bool bRespectQuiteTime*/ false);
Sleep(10000);
TrayIcon.Balloon( L"New Title",
L"New Message",
(HICON) LoadImageW(Status::hInstance, L"icon2.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE));
的圖標。但Balloon()
方法不起作用。不顯示氣球頂端提示。
我可以通過添加NIF_INFO
恆定的uFlags
,和填滿szInfoTitle
和szInfo
構件使其在創建顯示氣球。但我想要實現的是在任意時間通過調用Balloon()
方法來顯示它。
我在這裏錯過了什麼?
用[已知能正常工作碼(http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ NotifyIcon.cs,d6f06dbccbf7a452)作爲指南。請注意它如何使用uFlags。 –