【发布时间】:2012-10-18 12:34:23
【问题描述】:
我看到通知气球,但没有显示图标。并且在成功(返回 TRUE)调用 Shell_NotifyIcon 后出现 Windows 错误:尝试引用不存在的令牌。主要问题是为什么我看不到图标? Windows 7 使用最新更新。
这是一个代码sn-p:
namespace tray_tip
{
#define FINAL_INIT( tip, title, ic, icon_id, inst )\
if ( icon )\
{\
static const GUID myGUID = \
{0x23977b55, 0x10e0, 0x4041, {0xb8, 0x62, 0xb1, 0x95, 0x41, 0x96, 0x36, 0x69}};\
data.guidItem = myGUID;\
data.dwInfoFlags |= NIF_ICON;\
ExtractIconEx( _T("task_dialog_test.ico"), 0, NULL, &(data.hIcon), 1 );\
}\
data.dwInfoFlags |= ic;\
_tcscpy_s( data.szInfo, tip );\
_tcscpy_s( data.szInfoTitle, title );
static NOTIFYICONDATA data = {0};
inline void init( HWND const & parent, UINT const & msg_id, UINT const & time_out = 30 )
{
ULONGLONG ullVersion = GetDllVersion( _T( "Shell32.dll" ) );
if ( ullVersion > MAKEDLLVERULL ( 6,0,0,0 ) )
data.cbSize = sizeof ( NOTIFYICONDATA );
else if ( ullVersion == MAKEDLLVERULL( 6,0,0,0 ) )
data.cbSize = sizeof( NOTIFYICONDATA_V3_SIZE );
else if ( ullVersion >= MAKEDLLVERULL( 5,0,0,0 ) )
data.cbSize = NOTIFYICONDATA_V2_SIZE;
else
data.cbSize = NOTIFYICONDATA_V1_SIZE;
data.hWnd = parent;
data.uFlags = NIF_INFO | NIF_MESSAGE;// | NIF_SHOWTIP;
data.uCallbackMessage = msg_id;
data.uTimeout = time_out;
}
inline BOOL show( BOOL show = FALSE, TCHAR tip[256] = _T(""), TCHAR title[64] = _T(""), DWORD const & ic = NIIF_INFO, UINT const & icon = 0, HINSTANCE const & inst_h = NULL )
{
FINAL_INIT( tip, title, ic, icon, inst_h );
return Shell_NotifyIcon( show == TRUE ? NIM_ADD : NIM_DELETE, &data ); // function checks if version can be changed if it was preset.
}
}
【问题讨论】:
-
确保可以在系统路径上找到
task_dialog_test.ico或构造完整的文件名,包括该文件的路径。还要检查ExtractIconEx的返回值是多少。该文件实际上是否包含小(不是大)图标? -
当然,handle在图标提取后有效。还使用了带有图标 ID 的 LoadImage。错误不存在。 @err,hr 指出的错误消息在未向数据结构中添加图标时也会出现。附言还解雇了 guid,只放了 data.uID。结果相同。
-
ExtractIconEx 返回一个。
-
您的代码摘录不完整:不清楚在哪里调用了
init。