MFC程序最小化到系统托盘及其响应函数
预备知识:
Windows API函数:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA pnid
);
该函数的两个参数:
第一个参数dwMessage可以取以下值:
NIM_MODIFY 修改托盘中的图标
NIM_DELETE 从托盘中删除一个图标
第二个参数pnid是NOTIFYICONDATA结构的一个引用。该结构的原型如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; // 结构的大小,必须在程序中给出
HWND hWnd; // 程序中将要接收托盘消息的窗口句柄
UINT uID; // 应用程序中定义的托盘图标ID,此参数用作标识
UINT uFlags; //设置属性 标记下边3个参数是否有效
UINT uCallbackMessage; // 自定义的消息ID值
HICON hIcon; //显示在系统托盘上的Icon的句柄
char szTip[]; // 用于图标显示的提示字符串
} NOTIFYICONDATA, *PNOTIFYICONDATA;
具体步骤:
1.在CxxxDlg.h中增加一个私有的NOTIFYICONDAT对象和消息处理函数;
private:
NOTIFYICONDATA m_notify;
afx_msg LRESULT OnTrayMsg(WPARAM wparan, LPARAM lparam); //托盘处理函数
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);//最小化按键响应
afx_msg void OnDestroy();//程序退出时删除托盘图标
afx_msg void setTray();//设置托盘图标
2.WM_USER_NOTIFYICON是自定义的消息 在文件CxxxDlg.cpp文件开头中进行声明;
#define WM_USER_NOTIFYICON WM_USER+1
3.添加映射:
BEGIN_MESSAGE_MAP(CxxxDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_MESSAGE(WM_USER_NOTIFYICON, &CxxxDlg::OnTrayMsg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
4.实现自定义的消息处理函数,在消息处理函数中对自定义的消息进行处理;
LRESULT CxxxDlg::OnTrayMsg(WPARAM wparam, LPARAM lparam);
LRESULT CxxxDlg::OnTrayMsg(WPARAM wparam, LPARAM lparam)
{
if(wparam!=IDR_MAINFRAME)
return ;
switch(lparam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOWNORMAL);//显示主窗口
this->SetWindowPos(&wndTopMost,,,,,SWP_NOMOVE|SWP_NOSIZE);//使窗口总是在最前面
this->SetWindowPos(&wndNoTopMost,,,,,SWP_NOMOVE|SWP_NOSIZE);//使窗口可以被其他窗口覆盖
}
break;
}
return ;
}
void CxxxDlg::OnDestroy();
void CxxxDlg::OnDestroy()
{
CDialog::OnDestroy(); Shell_NotifyIcon(NIM_DELETE, &m_notify);//退出程序后删除图标
}
void CxxxDlg::setTray();
void CxxxDlg::setTray()
{
m_notify.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
m_notify.hWnd = this->m_hWnd;
m_notify.uID = IDR_MAINFRAME;
m_notify.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
m_notify.uCallbackMessage = WM_USER_NOTIFYICON;//自定义的消息名称
m_notify.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_notify.szTip,"托盘程序"); //信息提示条
Shell_NotifyIcon(NIM_ADD,&m_notify); //在托盘区添加图标
ShowWindow(SW_HIDE); //隐藏主窗
}
void CxxxDlg::OnSysCommand(UINT nID, LPARAM lParam);
void CxxxDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
CDialog::OnSysCommand(nID, lParam);
if(nID==SC_MINIMIZE)
{
setTray();//最小化到托盘
}
}
完成。
参考资料:
MFC程序最小化到系统托盘及其响应函数的更多相关文章
- WPF应用程序最小化到系统托盘
using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows; u ...
- 将 VMware 最小化到系统托盘
1, 下载 Trayconizer官网地址: http://www.whitsoftdev.com/trayconizer/下载地址: http://www.whitsoftdev.com/files ...
- C# WinForm窗口最小化到系统托盘
* C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...
- Delphi 7下最小化到系统托盘
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789 _NOTIFY ...
- Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789 _NOTIFY ...
- 将Mozilla ThunderBird最小化到系统托盘(转载)
转自:http://be-evil.org/mozilla-thunderbird-minize-to-tray.html Mozilla ThunderBird是一款非常不错的邮件客户端,但是其在默 ...
- WPF应用最小化至系统托盘运行
原文:WPF应用最小化至系统托盘运行 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/5178889 ...
- electron监听系统托盘,electron是否最小化到系统托盘
在项目中需要判断窗口是否最小化在系统托盘上,任务栏那已经关闭,查了一晚上的api,始终找不到可以调用的方法,最后绞尽脑汁想到了一个办法,那就是在点右上角的关闭按钮时,加个全局变量,用来标识已经最小到系 ...
- VC实现将对话框最小化到系统托盘
1.minisysDlg.h头文件设置: 1)public: void setTray();//设置托盘 NOTIFYICONDATA nid;//NOTIFYICONDATA结构包含了系统用来 ...
随机推荐
- 《Visual C++ 2010入门教程》系列二:安装、配置和首次使用VS2010
作者:董波 日期:2010.6.15 写在前面 在我还在上学的时候,我选择了C++,最初我用VC6作为我的IDE,我看过很多本C++的教材,有的适合我,有的不适合我,其中有一本叫<Visual ...
- Avoiding memory leaks
Android applications are, at least on the T-Mobile G1, limited to 16 MB of heap. It's both a lot of ...
- java获取操作系统的MAC地址和硬盘序列号
1.判断操作系统是Windows还是Linux private static Boolean isLinux() { String os = System.getProperty("os.n ...
- asp.net mvc razer
Asp.net MVC Razor模板引擎技巧分享 http://www.cnblogs.com/JustRun1983/p/3545303.html 全新的membership框架Asp.net I ...
- bzoj 3784: 树上的路径【点分治+st表+堆】
参考:https://www.cnblogs.com/CQzhangyu/p/7071477.html 神奇的点分治序(或者叫点剖?).就是把点分治扫过的点依次放进队列里,然后发现,对于每一棵树摊到序 ...
- 状压入门--bzoj1087: [SCOI2005]互不侵犯King【状压dp】
Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行, ...
- Spring Cloud Eureka配置文件例子与较为详细说明
Eureka服务端: application.yml # eureka(最)简单单点开发配置.支持yml与properties两种,yml文件后缀必须为yml,不能是yaml,否则找不到该文件,使用默 ...
- $Edmonds-Karp$[网络流]
\(原题戳这里\) >最大流最小割定理$(Maximum Flow, Minimum Cut Theorem): $ 网络的最大流等于最小割 具体的证明分三部分 1.任意一个流都小于等于任意一个 ...
- easy ui combotree的操作
1.获取combotree的选中值 $("#id").combotree("getValue"); 2.设置combotree的选中值 $('#id').com ...
- ava的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...