作为Windows操作系统中常见的图标通知功能,通知区域提供了一种方便和快速的方式来展示系统状态和提示用户重要信息的途径。
但是,通知区域的默认行为很难适应许多应用程序的需要。很多应用程序希望有一种自己特定的方式将信息通知给用户,而不是只能通过标准的弹出提示框来实现。 对于此类应用程序而言,“notifyicondata”这个结构体就变得尤为重要,因为它提供了令通知区域变得更加定制化的工具。
什么是“notifyicondata”?
NotifyIconData是一个Windows系统API中的结构体,其定义如下:
typedef struct _notifyicondata {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[64];
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
HICON hBalloonIcon; } NOTIFYICONDATA, *PNOTIFYICONDATA;
这个结构体描述了一个在通知区域展示图标或者弹出提示框的操作所需的必需参数。 当我们在应用程序中需要扩展该图标或者该图标的行为时,我们可以使用该结构体来进一步自定义。
如何使用NotifyIconData?
NotifyIconData的结构体只是一个包含了我们希望通知区域呈现的信息的数据容器。 使用时,我们还需要启用相应的API函数来告诉Windows将这些数据发送到通知区域。
以下是一个通用的带有NotifyIconData的代码示例,其中“hwnd”和“uID”值需要根据应用程序的具体情况替换成相应的值。
NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hwnd;
nid.uID = uID;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_APP_SYSTRAY;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), L"My tooltip");
Shell_NotifyIcon(NIM_ADD, &nid);
该代码创建了一个包含了一个图标、一个消息和一个工具提示的NotifyIconData结构体。 它利用了Windows的“Shell_NotifyIcon”API来向系统发送一个NIM_ADD消息,该消息要求将该图标添加到通知区域中。
可以通过修改这个结构体的各种字段来实现与通知区域进行交互的几乎任何操作,从添加更多菜单选项和子菜单到实现对鼠标事件的响应。
以下是一个可能包括菜单的NotifyIconData结构体的示例:
NOTIFYICONDATA nid;
ZeroMemory(&nid, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = hwnd;
nid.uID = uID;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_SHOWTIP | NIF_GUID | NIF_INFO;
nid.uCallbackMessage = WM_APP_SYSTRAY;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), L"My tooltip");
nid.dwState = NIS_HIDDEN;
nid.dwStateMask = NIS_HIDDEN;
nid.guidItem = MY_GUID;
nid.hBalloonIcon = LoadImage(hInstance, MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
StringCchCopy(nid.szInfo, ARRAYSIZE(nid.szInfo), L"My message");
StringCchCopy(nid.szInfoTitle, ARRAYSIZE(nid.szInfoTitle), L"My title");
nid.dwInfoFlags = NIIF_INFO;
Shell_NotifyIcon(NIM_ADD, &nid);
在这种情况下,NotifyIconData结构体包含了一个带有标题和子菜单的提示框,用于显示当图标被单击时弹出的信息。 另外,该结构体还含有一个关于该图标的GUID标识符,以确保在通知区域中没有其他应用程序使用该标识符冲突。
NotifyIconData可以实现哪些功能?
使用NotifyIconData可以实现的功能基本上是无限的,可以根据应用程序的需要来进行扩展和缩放。以下是一些常见的示例:
1. 显示图标和工具提示:NotifyIconData结构体最常见的用途是让应用程序直接在通知区域中显示一个图标和一个工具提示,以便提供一些简短的、与该图标相关的信息。
2. 调用菜单选项和子菜单:通过这一工具,通知区域中的图标可以按照应用程序的需要来显示各种菜单选项以及子菜单,这些选项可以被单击或选择。
3. 通过右键单击启用特定的行为:通知区域图标可以通过右键单击执行诸如弹出某个特定窗口或触发某个应用程序函数的操作。
4. 与鼠标事件交互:NotifyIconData可以被设置为对左/右/双击、鼠标移动和滚动等鼠标事件进行响应。
5. 弹出自定义提示框:更复杂的NotifyIconData结构体还可以实现带有多个按钮、自定义图标和标题的提示框,以及能够识别一些特定区域和键盘按键的复杂交互模式。
总结
NotifyIconData是开发Windows桌面应用程序时非常有用的工具之一,它可以将通知区域做到更加定制化。 虽然这个结构体可能看起来非常简单,但它可以为应用程序设计提供无限的灵活性和扩展性。 通过了解NotifyIconData的基本结构和使用方式,开发人员可以更有效地利用Windows操作系统中的通知区域,并将其调整到符合应用程序需要的样子。