shell_notifyicon和NOTIFYICONDATA

本文详细介绍了Shell_NotifyIcon函数的使用方法,包括如何在任务栏托盘区域添加、删除和修改图标,以及如何处理与托盘图标相关的消息。此外还提供了在MFC中实现最小化到托盘的具体步骤。

shell_notifyicon和NOTIFYICONDATA

Shell_NotifyIcon函数,向 任务栏的状态栏发送一个消息
函数原型
BOOL Shell_NotifIcon(
DWORD  dwMessage,
PNOTIFYICONDATA  lpdata
);
参数:
dwMessage为输入参数,传递发送的消息,表明要执行的操作。可选的值如下:
NIM_ADD
向托盘区域添加一个图标。此时第二个参数lpdata指向的 NOTIFYICONDATA 结构体中的hWnd和uID成员用来标示这个图标,以便以后再次使用Shell_NotifyIcon对此图标操作。
NIM_DELETE
删除托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA 结构体中的hWnd和uID成员用来标示需要被删除的这个图标。
NIM_MODIFY
修改托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA 结构体中的hWnd和uID成员用来标示需要被修改的这个图标。
NIM_SETFOCUS
Version 5.0. 设置焦点。比如当用户操作托盘图标弹出菜单,而有按下ESC键将菜单消除后,程序应该使用此消息来将焦点设置到托盘图标上。
NIM_SETVERSION
Version 5.0. 设置 任务栏按照第二个参数lpdata指向的NOTIFYICONDATA 结构体中的uVersion成员指定的版本号来工作。此消息可以允许用户设置是否使用基于Windows2000的version 5.0的风格。uVersion的缺省值为0,默认指明了使用原始Windows 95图标消息风格。具体这两者的区别请参考msdn中的Shell_NotifyIcon函数说明的Remarks。
lpdata为输入参数,是指向NOTIFYICONDATA 结构体指针,结构体内容用来配合第一个参数wMessage进行图标操作。
如果图标操作成功返回TRUE,否则返回FALSE。
如果dwMessage参数设为NIM_SETVERSION,则如果版本设置成功返回TRUE,如果设置的版本不支持返回FALSE。
 
该函数主要用于 任务栏右侧的托盘图标的操作。在MFC中,实现最小化到托盘的具体操作如下:
1.在Resource里新建一个图标 Icon 。
2.在窗体类里添加 NOTIFYICONDATA  结构体对象 m_nfData,可以在OnInitDialog()方法里对结构体进行初始化。
3.重写OnSize(UINT,int,int)函数,自行处理SIZE_MINIMIZED 消息,即点击最小化后的处理。例如:
void CYourProjectDlg::OnSize(UINT nType, int cx, int cy)
{
if( nType == SIZE_MINIMIZED ) //截获消息
{
Shell_NotifyIcon(NIM_ADD,&m_nfData);
ShowWindow(SW_HIDE);
}
else //其他消息按默认处理方式处理
CDialog::OnSize(nType, cx, cy);
}
4.添加消息映射,处理WM_TRAYICON消息,即点击托盘图标后的处理
ON_MESSAGE(WM_TRAYICON,&CYourProjectDlg::OnTrayIcon)
5.实现消息映射函数,添加具体操作,例如:
LRESULT CLogCleanToolDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
if(lParam ==  WM_LBUTTONDBLCLK) //双击托盘图标
{
Shell_NotifyIcon(NIM_DELETE,&m_nfData);
ShowWindow(SW_SHOWNORMAL);
}
return 0;
}
以上就是最常见的用法。如果要其他个性操作,只需修改 NOTIFYICONDATA 结构体的参数即可
 
NOTIFYICONDATA是一个函数公式主要含义和作用是以此函数用来向 任务栏托盘区域发送消息。
 
函数格式
BOOL Shell_NotifyIcon( DWORD dwMessage,PNOTIFYICONDATA lpdata);
 
dwMessage为输入 参数,传递发送的消息,表明要执行的操作。可选的值如下:
NIM_ADD
向托盘区域添加一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA 结构体中的hWnd和uID成员用来标示这个图标,以便以后再次使用Shell_NotifyIcon对此图标操作。
NIM_DELETE
删除托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA 结构体中的hWnd和uID成员用来标示需要被删除的这个图标。(说明,删除托盘区一般情况下指定hWnd和uID就可以了,但也有例外,当向托盘区添加完图标后,鼠标右击托盘图标,应用程序这时会弹出一个菜单,左键单击一个菜单项。假如应用程序弹出了一个对话框,好,把它关掉,这时再右键单击托盘区图标,在弹出的菜单中选择“退出”菜单,结果,程序退出了,而图标却还在那,如果这时把鼠标移到图标上,图标会立马消失。但这不是我们想要的结果。所以要想保证程序退出时托盘区图标消失,请添加如下语句:
NOTIFYICONDATA tnid;
tnid.uFlags = NIF_ICON;
OK。这样就大功告成了。)
NIM_MODIFY
修改托盘区域的一个图标。此时第二个参数lpdata指向的NOTIFYICONDATA 结构体中的hWnd和uID成员用来标示需要被修改的这个图标。
NIM_SETFOCUS
Version 5.0. 设置焦点。比如当用户操作托盘图标弹出菜单,而有按下ESC键将菜单消除后,程序应该使用此消息来将焦点设置到托盘图标上。
NIM_SETVERSION
Version 5.0. 设置 任务栏按照第二个参数lpdata指向的NOTIFYICONDATA 结构体中的uVersion成员指定的版本号来工作。此消息可以允许用户设置是否使用基于Windows2000的version 5.0的风格。uVersion的缺省值为0,默认指明了使用原始Windows 95图标消息风格。具体这两者的区别请参考msdn中的Shell_NotifyIcon函数说明的Remarks。
lpdata为输入参数,是指向NOTIFYICONDATA 结构体指针,结构体内容用来配合第一个参数wMessage进行图标操作。
 
如果图标操作成功返回TRUE,否则返回FALSE。
如果dwMessage参数设为NIM_SETVERSION,则如果版本设置成功返回TRUE,如果设置的版本不支持返回FALSE。
 
包含系统需要的用来传递托盘区域消息的信息。
 
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;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
} NOTIFYICONDATA, *PNOTIFYICONDATA;

6成员说明

cbSize
结构体的大小,以 字节为单位。
hWnd
窗口的句柄。标示的窗口用来接收与托盘图标相关的消息。Shell_NotifyIcon 函数调用时,hWnd和uID成员用来标示具体要操作的图标。
uID
应用程序定义的任务栏图标的标识符。Shell_NotifyIcon函数调用时,hWnd和uID成员用来标示具体要操作的图标。通过将多次调用,你可以使用不同的uID将多个图标关联到一个窗口hWnd。
uFlags
此成员表明具体哪些其他成员为合法数据(即哪些成员起作用)。此成员可以为以下值的组合:
NIF_ICON
hIcon成员起作用。
NIF_MESSAGE
uCallbackMessage成员起作用。
NIF_TIP
szTip成员起作用。
NIF_STATE
dwState和dwStateMask成员起作用。
NIF_INFO
使用气球提示代替普通的工具提示框。szInfo, uTimeout, szInfoTitle和dwInfoFlags成员起作用。
NIF_GUID
保留。
uCallbackMessage
应用程序定义的消息标示。当托盘图标区域发生鼠标事件或者使用键盘选择或激活图标时,系统将使用此标示向由hWnd成员标示的窗口发送消息。消息响应函数的wParam参数标示了消息事件发生的 任务栏图标,lParam参数根据事件的不同,包含了鼠标或键盘的具体消息,例如当 鼠标指针移过托盘图标时,lParam将为WM_MOUSEMOVE。
hIcon
增加、修改或删除的图标的句柄。注意,windows不同版本对于图标有不同要求。Windows XP可支持32位。
szTip
指向一个以\0结束的字符串的 指针。字符串的内容为标准工具提示的信息。包含最后的\0字符,szTip最多含有64个字符。
对于Version 5.0 和以后版本,szTip最多含有128个字符(包含最后的\0字符)。
dwState
Version 5.0,图标的状态,有两个可选值,如下:
NIS_HIDDEN
图标隐藏
NIS_SHAREDICON
图标共享
dwStateMask
Version 5.0. 指明dwState成员的那些位可以被设置或者访问。比如设置此成员为NIS_HIDDEN,将导致只有hidden状态可以被获取。
szInfo
Version 5.0. 指向一个以\0结束的字符串的 指针。字符串的内容为气球提示内容。最多含有255个字符。如果要移除已经存在的气球提示信息,设置uFlags成员为NIF_INFO,同时将szInfo设为空。
uTimeout
和uVersion成员为 联合体。uTimeout表示气球提示超时的时间,单位为毫秒,此时间后气球提示将消失。系统默认气球提示的超时时间最小值为10秒,最大值为30秒。如果设置的uTimeout的值小于10将设置最小值,如果大于30将设置最大值。将超时时间分为最大最小两种,是因为解决不同图标的气球提示同时弹出的问题,详细内容请参考MSDN中NOTIFYICONDATA 结构体说明的remarks。
uVersion
Version 5.0. 和uTimeout成员为 联合体。用来设置使用Windows 95 还是 Windows 2000风格的图标消息接口。请参考Shell_NotifyIcon函数的说明获取更多信息。只有当使用Shell_NotifyIcon函数发送NIM_SETVERSION消息时,此成员才有作用。可选的值如下:
0
使用Windows 95风格。针对Windows 2000版本之前的windows设计的软件请使用此值。
NOTIFYICON_VERSION
使用Windows 2000风格。 针对Windows 2000版本以及以后版本的windows设计的软件请使用此值。
szInfoTitle
Version 5.0. 指向一个以\0结束的字符串的指针。字符串的内容为气球提示的标题。此标题出现在气球提示框的上部,最多含有63个字符。
dwInfoFlags
Version 5.0. 设置此成员用来给气球提示框增加一个图标。增加的图标出现在气球提示标题的左侧,注意如果szInfoTitle成员设为空字符串,则图标也不会显示。可选值如下:
NIIF_ERROR
错误图标。
NIIF_INFO
信息图标。
NIIF_NONE
没有图标。
NIIF_USER
使用用户使用hIcon成员指明的图标,要求Windows XP Service Pack 2 (SP2)或以后系统。
NIIF_WARNING
警告图标。
NIIF_ICON_MASK
Version 6.0. 保留。
NIIF_NOSOUND
Version 6.0. 禁止播放相应声音。
guidItem
Version 6.0. 保留。

<think>我们正在处理用户关于win32gui.Shell_NotifyIcon的使用方法示例代码的请求。用户引用了四段内容,其中包含了一些关于托盘图标设置的信息,但我们需要整合这些信息并给出一个清晰的示例。根据引用[1][2]:-使用`Shell_NotifyIcon`函数需要填充`NOTIFYICONDATA`结构体。-该结构体包含图标、提示信息、回调消息等信息。-通过`Shell_NotifyIcon`函数向系统通知区域添加、修改或删除图标。引用[3][4]提到了一些Python中使用`win32gui`的片段,但有些问题(比如提示显示时间设置无效)。用户需求:`win32gui.Shell_NotifyIcon`的使用方法及示例代码。步骤:1.导入必要的模块(win32gui,win32api,win32con)。2.定义窗口类并创建窗口(用于接收托盘消息)。3.定义消息处理函数(处理托盘事件,如鼠标点击)。4.填充`NOTIFYICONDATA`结构体(使用win32gui的NIF_*标志)。5.调用`Shell_NotifyIcon`函数添加托盘图标。6.消息循环。注意:在Python中,我们使用`win32gui`模块,它是对WindowsAPI的封装。示例代码将包括:-添加托盘图标。-处理托盘消息(如鼠标左键双击显示窗口,右键弹出菜单等)。-删除托盘图标(程序退出时)。由于引用[4]提到提示显示时间设置可能无效,我们将按照常规方式设置,并说明可能存在系统限制。下面给出一个完整的示例代码,并添加详细注释。</think>### Win32gui Shell_NotifyIcon 使用方法详解 `win32gui.Shell_NotifyIcon` 是 Windows API 中用于管理系统托盘图标的函数,通过操作 `NOTIFYICONDATA` 结构体实现图标的添加、修改删除。以下是具体使用方法示例: #### 核心步骤 1. **导入模块**: ```python import win32gui import win32api import win32con ``` 2. **定义消息常量**: ```python WM_TRAYICON = win32con.WM_USER + 1 # 自定义托盘消息ID ``` 3. **填充 NOTIFYICONDATA 结构体**: ```python nid = ( hwnd, # 接收消息的窗口句柄 0, # 托盘图标ID win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP, # 标志位 WM_TRAYICON, # 回调消息ID hIcon, # 图标句柄 "托盘提示文本" # 悬停提示文本 ) ``` 4. **操作托盘图标**: ```python # 添加图标 win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, nid) # 修改图标 win32gui.Shell_NotifyIcon(win32gui.NIM_MODIFY, nid) # 删除图标 win32gui.Shell_NotifyIcon(win32gui.NIM_DELETE, nid) ``` #### 完整示例代码 ```python import win32gui import win32api import win32con import os # 自定义消息 WM_TRAYICON = win32con.WM_USER + 1 WM_LBUTTONDBLCLK = win32con.WM_LBUTTONDBLCLK class TrayIcon: def __init__(self): # 创建隐藏窗口 wc = win32gui.WNDCLASS() wc.hInstance = win32api.GetModuleHandle(None) wc.lpszClassName = "TrayDemo" wc.lpfnWndProc = self._wndProc self.classAtom = win32gui.RegisterClass(wc) self.hwnd = win32gui.CreateWindow( self.classAtom, "TrayWindow", 0, 0, 0, 0, 0, 0, 0, wc.hInstance, None ) # 加载图标 icon_path = os.path.abspath("app.ico") hIcon = win32gui.LoadImage( None, icon_path, win32con.IMAGE_ICON, 0, 0, win32con.LR_LOADFROMFILE ) # 配置托盘 nid = ( self.hwnd, 0, win32gui.NIF_ICON | win32gui.NIF_MESSAGE | win32gui.NIF_TIP, WM_TRAYICON, hIcon, "双击显示窗口" ) win32gui.Shell_NotifyIcon(win32gui.NIM_ADD, nid) # 消息循环 win32gui.PumpMessages() def _wndProc(self, hwnd, msg, wparam, lparam): if msg == WM_TRAYICON: if lparam == WM_LBUTTONDBLCLK: win32api.MessageBox(0, "托盘图标被双击", "提示", win32con.MB_OK) return win32gui.DefWindowProc(hwnd, msg, wparam, lparam) if __name__ == '__main__': TrayIcon() ``` #### 关键参数说明 1. **NOTIFYICONDATA 标志位**: - `NIF_MESSAGE`:启用回调消息 - `NIF_ICON`:设置有效图标 - `NIF_TIP`:启用悬停提示 - `NIF_INFO`:气球提示(引用[4]提到时间设置可能受限) 2. **操作类型**: - `NIM_ADD`:添加新图标 - `NIM_MODIFY`:更新现有图标 - `NIM_DELETE`:删除图标 3. **消息处理**: - 当用户操作托盘图标时,系统会向指定窗口发送 `WM_TRAYICON` 消息 - `lparam` 包含具体事件(如单击、双击等) #### 注意事项 1. 图标文件需使用 `.ico` 格式,建议尺寸 16x16 或 32x32 2. 程序退出前必须调用 `NIM_DELETE` 删除图标(引用[2]) 3. 气球提示的显示时间受系统限制(引用[4]) 4. 需保持消息循环运行(`PumpMessages()`) > 参考实现:托盘图标通过 `NOTIFYICONDATA` 结构体配置[^1],通过 `Shell_NotifyIcon` 发送 WM_COPYDATA 消息与系统交互[^2],Python 中需绑定消息处理函数[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值