建立一个任务栏通知程序

来源:互联网 发布:linux stat权限 编辑:程序博客网 时间:2024/05/20 23:02
建立一个任务栏通知程序
1.首先建立一个基于对话框的应用程序,名称为Tray。

2.在对话框的OnInitDialog()函数中,加入如下代码,使对话框程序运行时出现在任务栏的通知区域:

//移动对话框到不可见区域
AfxGetMainWnd()->MoveWindow(-500,-500,100,100,true);

//设置对话框属性,使其不在任务栏上显示
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
WS_EX_TOOLWINDOW|WS_EX_STATICEDGE);

(对于SDI应用程序,应该在CMainFrame::PreCreateWindow()中使用下面代码使其主窗口不可见且不在任务栏出现
cs.style = WS_POPUP;
cs.dwExStyle = WS_EX_TOOLWINDOW;)

//加到任务栏////////////////////////
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=AfxGetMainWnd()->m_hWnd;
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=WM_PROC;
tnd.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
strcpy(tnd.szTip,"我的任务栏程序");
Shell_NotifyIcon(NIM_ADD,&tnd);

3.添加自定义消息处理函数

在TrayDlg.h文件开头加入

#define WM_PROC WM_USER+100

在中间相应的地方加入:

afx_msg void OnProc(WPARAM wParam,LPARAM lParam);

在TrayDlg.cpp中加入:

ON_MESSAGE(WM_PROC,OnProc)

以及下面代码来响应鼠标的点击处理

void CTrayDlg::OnProc(WPARAM wParam,LPARAM lParam)
{
UINT uMouseMsg;//鼠标动作
uMouseMsg=(UINT) lParam;

if(uMouseMsg==WM_LBUTTONDOWN)
{
ATOM GlobalAtom;
if(!GlobalFindAtom("Aboutc"))
{
GlobalAtom=GlobalAddAtom("Aboutc");

CAboutDlg dlg; //弹出About对话框
dlg.DoModal();

GlobalDeleteAtom(GlobalAtom);
}
}
if(uMouseMsg==WM_RBUTTONDOWN)
{
AfxGetMainWnd()->SetForegroundWindow(); //弹出Popup菜单
CMenu menu;
menu.LoadMenu(IDR_TRAYMENU);
CMenu* pPopup=menu.GetSubMenu(0);
CPoint Point;
GetCursorPos(&Point);
pPopup->TrackPopupMenu(TPM_LEFTALIGN,Point.x,Point.y,AfxGetMainWnd(),NULL );
AfxGetMainWnd()->PostMessage(WM_NULL, 0, 0);
}
}
并添加一个只有两项(关于|关闭)的子菜单,用于右键点击图标时的弹出菜单

4.添加菜单处理程序

void CTrayDlg::OnAboutc()
{
//利用原子来禁止程序运行多个实例

ATOM GlobalAtom;
if(!GlobalFindAtom("Aboutc"))
{
GlobalAtom=GlobalAddAtom("Aboutc");

//弹出About对话框
CAboutDlg dlg;
dlg.DoModal();

GlobalDeleteAtom(GlobalAtom);
}
}

void CTrayDlg::OnClosec()
{

NOTIFYICONDATA tnid;
tnid.cbSize=sizeof(NOTIFYICONDATA);
tnid.hWnd=AfxGetMainWnd()->m_hWnd;
tnid.uID=IDR_MAINFRAME;
Shell_NotifyIcon(NIM_DELETE,&tnid);

CDialog::OnClose();
this->PostMessage(WM_CLOSE,0,0);

}