仿MSN,在任务栏注册一个图标.和拦截关闭WM_CLOSE消息.
2005-12-26 14:29
459 查看
要想在任务栏注册一个图标,须要用到一个API,
BOOL Shell_NotifyIcon( DWORD dwMessage, //指几个宏,如果是增加就是:NIM_ADD,删除图标就是:NIM_DELETE PNOTIFYICONDATA lpdata //一个指向NOTIFYICONDATA结构的指针 );
在这里我们主要是关注结构typedef struct _NOTIFYICONDATA { DWORD cbSize; //本结构的大小,就是sizeof(NOTIFYICONDATA); HWND hWnd; //关联的窗口名柄.this->m_hWnd UINT uID; //就是你指定操作的ICON ID,DEFAULT就是IDR_MAINFRAME UINT uFlags; //NIF_ICON|NIF_MESSAGE|NIF_TIP UINT uCallbackMessage; //这里是一个自定义消息的CALL BACK MESSAGE如;WM_MYMSG HICON hIcon; //图标句柄.系统图标就是:AfxGetApp()->LoadIconA(IDR_MAINFRAME); TCHAR szTip[64]; //显示的TIPS, DWORD dwState; DWORD dwStateMask; TCHAR szInfo[256]; union { UINT uTimeout; UINT uVersion; }; TCHAR szInfoTitle[64]; DWORD dwInfoFlags; GUID guidItem; } NOTIFYICONDATA, *PNOTIFYICONDATA;
根据这个结构要求,我们要定义一个自定义消息.可以在文件头中加入#define WM_MYMSG (WM_USER+1)
只要是定义了这个结构,就可以用Shell_NotifyIcon函数注册一个ICON了可以将以下代码加入到窗口的OnInitDialog()中.
NOTIFYICONDATA m_Notify;
m_Notify.cbSize=sizeof(NOTIFYICONDATA); m_Notify.hWnd=this->m_hWnd; m_Notify.hIcon=AfxGetApp()->LoadIconA(IDR_MAINFRAME); m_Notify.uID=IDR_MAINFRAME; m_Notify.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; m_Notify.uCallbackMessage=WM_MYMSG; //这就是自订义的消息. strcpy_s(m_Notify.szTip,_T("LiJun Mail Sniffer")); Shell_NotifyIcon(NIM_ADD,&m_Notify);
但是,现在还不能对自订消息进行处理,在类中加一个自定义消息处理函数声明:
afx_msg LRESULT OnDeng(WPARAM wParam,LPARAM lParam);
再加入映射:
BEGIN_MESSAGE_MAP()
....
ON_MESSAGE(WM_MYMSG,OnDeng)
...
END_MESSAGE_MAP()
函数实现:下面的示例是右健弹出一个MENU.
LRESULT 类名::OnDeng(WPARAM wParam, LPARAM lParam){ POINT pt; GetCursorPos(&pt); if(wParam==IDR_MAINFRAME){ if(lParam==WM_RBUTTONDOWN) { m_Menu.GetSubMenu(0)->TrackPopupMenuEx(0,pt.x,pt.y,this,NULL);
}else if(lParam==WM_LBUTTONDOWN) { ShowWindow(SW_SHOW); UpdateWindow(); } }
最后,我们要在程序退出后删除掉这个注册ICON:
可以在OnDestroy()中加入:
::Shell_NotifyIcon(NIM_DELETE,&m_Notify);
如果要拦截WM_CLOSE消息,不让关闭程序,其实很简单,对于单文档应用程序,
只要在On_Close()中重新写入代码即可.如下:
void 类名::OnClose(){ if(不想关闭)
{
ShowWindow(SW_HIDE); //HIDE WINDOW return;
} CWnd::OnClose(); }
相关文章推荐
- 用代码关闭程序的正确做法!---向窗口发送WM_CLOSE消息
- WM_CLOSE、WM_DESTROY、WM_QUIT学习总结(点击关闭按钮会触发WM_CLOSE消息,DestroyWindow API会触发WM_DESTROY和WM_NCDESTROY消息,MSDN上写的很清楚)
- 用代码关闭程序的正确做法!---向窗口发送WM_CLOSE消息
- 当一个窗口关闭时WM_CLOSE,WM_DESTROY,WM_QUIT
- windows变成点滴(八)之关闭消息WM_CLOSE,WM_QUIT,WM_QUIT
- MFC 关闭对话框时的WM_CLOSE消息响应
- Win10环境下,拦截WM_NCCREATE消息时的一个诡异BUG
- 当一个窗口关闭时WM_CLOSE,WM_DESTROY,WM_QUIT
- 关闭窗口时WM_CLOSE,WM_DESTROY,WM_QUIT消息
- 用代码关闭程序的正确做法!---向窗口发送WM_CLOSE消息
- 制作类似MSN Messager的任务栏图标及消息滚动窗口
- 怎么屏蔽鼠标所有左键消息在标题栏上(鼠标双击/单击系统图标,双击标题栏,最小化,最大化,关闭按钮)
- 一个简单的程序,点最小化按钮,程序最小化为一个图标最任务栏右边
- Windows/MFC_三个退出程序消息:WM_CLOSE、WM_DESTROY、WM_QUIT
- Java代理模式学习---完成一个数据库连接池中的close方法拦截
- API 拦截窗口关闭&最大化&最小化消息
- 立即获得下载任务完成的消息通知。Android DownloadManager通过注册一个广播监听系统的广播事件完成此操作,在创建广播时候,需要指明过滤器为:DownloadManager.ACTIO
- DuiLib : 做一个没有任务栏图标的Dialog
- wxPython in Action (EVT_CLOSE)当关闭一个框架时都发生了什么?
- 将“在任务栏上出现的两个eclipse图标”合为一个