清除通知托盘图标,Windows外壳

时间:2016-04-22 09:20:51

标签: c++ windows winapi notifications

问题:通知图标已注册的位置以及如何在已从其他位置注册时将其删除?

说明 我想使用通知托盘图标,因此我启动了一个Windows SDKs示例来检查它是如何工作的。

问题是,一旦从一个位置注册了图标,就无法在其他任何地方使用它。 Shell_NotifyIcon(...)从其他位置失败。它甚至在样本的自述文件中进行了描述:

  

请注意,使用GUID指定的通知图标可通过验证来防止欺骗   只有一个应用程序注册它们。此注册是在您第一次执行时执行的   调用Shell_NotifyIcon(NIM_ADD,...),并存储调用应用程序的完整路径名。如果你   稍后将二进制文件移动到其他位置,系统将不允许再次添加图标。

我在我的应用程序退出处尝试了Shell_NotifyIcon(NIM_DELETE,...),但它仍然无法运行,我的应用程序可以从不同的位置启动。 OFC。每次Shell_NotifyIcon(...)失败时我都可以通过改变guid来破解它,但是我更喜欢使用更少的强力方法。此外,我在系统注册表中搜索了guid,无法找到它。

样本中的guid定义如下:

df.loc[]

创建通知图标的代码:

// Use a guid to uniquely identify our icon
class __declspec(uuid("9D0B8B92-4E1C-488e-A1E1-2331AFCE2CB5")) PrinterIcon;

代码是Windows SDK示例的一部分:SDKs / Windows / v7.1 / Samples / winui / shell / appshellintegration / NotificationIcon

1 个答案:

答案 0 :(得分:1)

因此。最终的解决方案是我声明 NOTIFYICONDATA

#define NOTIFICATIONTRAY_UID 666;
[...]

NOTIFYICONDATA nid = { 0 };

nid.cbSize = sizeof( NOTIFYICONDATA );
nid.hWnd = hWnd;
nid.uID = NOTIFICATIONTRAY_UID;
nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE | NIF_SHOWTIP;
nid.uCallbackMessage = WMAPP_NOTIFYCALLBACK;

LoadIconMetric( hInstance, MAKEINTRESOURCE( IDI_NOTIFICATIONICON ), LIM_SMALL, &nid.hIcon );
lstrcpy( nid.szTip, L"Tooltip text" );
Shell_NotifyIcon( NIM_ADD, &nid );

// NOTIFYICON_VERSION_4 is prefered
nid.uVersion = NOTIFYICON_VERSION_4;
return ( Shell_NotifyIcon( NIM_SETVERSION, &nid ) != 0 );

我没有设置NIF_GUID标志和GUID。要稍后使用此图标(销毁,添加气球通知等),我必须提供HWND和uID(感谢Remy Lebeau建议)。