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结构包含了系统用来 ...
随机推荐
- js 弹出对话框的方法总结
原文:http://www.cnblogs.com/xiaofengfeng/archive/2012/10/20/2732784.html <!DOCTYPE html PUBLIC &quo ...
- python-----群发图片
使用wxpy库给3个人群发同一张图片 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/2/22 15:25 # @Author ...
- 安装MySQL需要注意的事项
一.安装MySQL之后,怎样启动MySQL,以及登录.查看数据库操作? 用管理员身份运行cmd或power shell 二.当然有可能会出现不能在cmd或power shell中登录数据库账户 造成这 ...
- 第四篇(那些JAVA程序BUG中的常见单词)
xxx cannot be resolved to a variable xxx无法解析为变量 resolve 解析
- 标准字符cp功能
#include<stdio.h> #include<fcntl.h> int main(int argc,char *argv[]) { FILE *src_fp,*des_ ...
- _bzoj1026 [SCOI2009]windy数【数位dp】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1026 数位dp果断记忆化搜索,代码量少~ 程序里我用11代表前导零. #include &l ...
- 贪心 Codeforces Round #236 (Div. 2) A. Nuts
题目传送门 /* 贪心:每一次选取最多的线段,最大能放置nuts,直到放完为止,很贪婪! 题目读不懂多读几遍:) */ #include <cstdio> #include <alg ...
- 使用Navicat迁移MySQL数据至Oracle时大小写原因报“表或视图不存在”问题处理
使用Navicat提供的数据传输工具将JEECMSv9的MySQL的数据迁移至Oracle数据库,数据迁移成功表都存在,但是在程序启动时提示表或视图不存在. Caused by: java.sql.S ...
- SSH---整合Struts2&Spring&Hibernate(实例)
一.SSH回顾 Struts2:核心为过滤器+拦截器.过程:Filter--->FilterDispatcher-->ActionMapper-->ActionProxy--> ...
- 学习笔记 第七章 使用CSS美化超链接
第7章 使用CSS美化超链接 学习重点 认识超链接 熟悉伪类 定义超链接样式 能够灵活设计符合页面风格的链接样式 7.1 定义超链接 在HTML5中建立超链接需要两个要素:设置为超链接的网页元素和 ...