zoukankan      html  css  js  c++  java
  • 【VS开发】最小化到托盘 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
    指向一个以结束的字符串的指针。字符串的内容为标准工具提示的信息。包含最后的字符,szTip最多含有64个字符。
    对于Version 5.0 和以后版本,szTip最多含有128个字符(包含最后的字符)。
    dwState
    Version 5.0,图标的状态,有两个可选值,如下:
    NIS_HIDDEN
    图标隐藏
    NIS_SHAREDICON
    图标共享
    dwStateMask
    Version 5.0. 指明dwState成员的那些位可以被设置或者访问。比如设置此成员为NIS_HIDDEN,将导致只有hidden状态可以被获取。
    szInfo
    Version 5.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. 指向一个以结束的字符串的指针。字符串的内容为气球提示的标题。此标题出现在气球提示框的上部,最多含有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. 保留。
  • 相关阅读:
    Java集合知识点小结
    集合类说明及区别
    微信翻译机器人实战
    细说:域名与SEO存在什么关系
    我为PHP摇旗呐喊!
    每个程序员都该知道的10大编码原则
    浏览器加载模式:window.onload和$(document).ready()
    修改Mysql编码集
    java实现LIS算法,出操队形问题
    [笔记]: 前向星 标签: 数据结构存储 2017-05-25 09:13 35人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/huty/p/8517276.html
Copyright © 2011-2022 走看看