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入门教程》系列三:关于C++的一些问题
<Visual C++ 2010入门教程>系列三:关于C++的一些问题 这一回我自己都不知道应该写点什么好,或许今天的篇幅会比往常短很多.我说过,这不是C++的教程,因为我还没有那个能 ...
- java 泛型的理解与应用
为什么使用泛型? 举个例子: public class GenericTest { public static void main(String[] args) { List list = new A ...
- 洛谷P3243 [HNOI2015]菜肴制作——拓扑排序
题目:https://www.luogu.org/problemnew/show/P3243 正向按字典序拓扑排序很容易发现是不对的,因为并不是序号小的一定先做: 但若让序号大的尽可能放在后面,则不会 ...
- mysql 数据库的名称不能以数字开头
mysql 数据库的名称不能以数字开头
- bzoj 3218: a + b Problem【主席树+最小割】
直接建图比较显然,是(s,i,w),(i,t,b),(i,i',p),(i,j,inf),然而建出来之后发现边数是n方级别的,显然跑不过去,然后就有一种比较神的思路:把a离散了建一棵权值线段树,然后要 ...
- P4324 [JSOI2016]扭动的回文串
传送门 对\(A\).\(B\)串各跑一遍\(manacher\),求出第\(1\).\(2\)类扭动回文串的最大长度. 考虑第三类的扭动回文串\(S(i,j,k)\),一定可以表示为\(A(i,l) ...
- SS上网配置(Window 7/8/10 )详解
SS很多人都会用到,尤其是做外贸的朋友,今天我们来说下SS相关的配置. 首先从官网下载解压后的目录如结构下: 点击***.exe,选择以管理员身份运行,切记打开后界面如下 服务器地址为一段I ...
- Python unittest 基本框架解析(2)
下面例子,是一般测试框架的基本结构 框架知识点包括:实例化被测试模块类.装载测试用例.测试套件打包.保存测试输出结果.生成测试报告等 测试情况包括 :跳过某个case.执行成功.执行失败 #待测试 ...
- Django MTV模型思想
一.Django的MTV分别代表: 1.Model(模型):负责业务对象与数据库的对象(ORM) 2.Template(模版):负责如何把页面展示给用户 3.View(视图):负责业务逻辑,并在适当的 ...
- 洛谷 P2056 [ZJOI2007]捉迷藏 || bzoj 1095: [ZJOI2007]Hide 捉迷藏 || 洛谷 P4115 Qtree4 || SP2666 QTREE4 - Query on a tree IV
意识到一点:在进行点分治时,每一个点都会作为某一级重心出现,且任意一点只作为重心恰好一次.因此原树上任意一个节点都会出现在点分树上,且是恰好一次 https://www.cnblogs.com/zzq ...