Windows 系统托盘编程实现

1,首先在dialog对象中添加一变量: NOTIFYICONDATA m_notifyIcon;

2,自定义一Windows 消息:#define WM_NC (WM_USER+1001)

3,在初始化函数oninitdialog中对m_notifyIcon进行初始化:

m_notifyIcon.cbSize = sizeof(NOTIFYICONDATA); m_notifyIcon.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_notifyIcon.hWnd = m_hWnd; lstrcpy(m_notifyIcon.szTip , L"NotifyIcon Test"); m_notifyIcon.uCallbackMessage = WM_NC; m_notifyIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; Shell_NotifyIcon(NIM_ADD , &m_notifyIcon);

4,设置消息响应函数:在messagemap里面添加:
ON_MESSAGE(WM_NC,OnNotifyIcon) // 注册
5,实现OnNotifyIcon的函数功能:
一般的使用方法是右击小图标出现一个菜单,所以这里添加一个菜单资源IDR_MENU1,在该菜单里面也可以添加消息响应函数,这里省略
LRESULT CMyplayDlg::OnNotifyIcon(WPARAM wParam,LPARAM IParam) { // 这个方法体你随便写。。我只做个演示。。 //if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN)) //{ // ModifyStyleEx(0 , WS_EX_TOPMOST); // ShowWindow(SW_SHOW); // 显示dialog // Shell_NotifyIcon(NIM_DELETE, &m_notifyIcon); // 清除小图标 //} switch(IParam) { case WM_LBUTTONDOWN: ModifyStyleEx(0 , WS_EX_TOPMOST); ShowWindow(SW_SHOW); // 显示dialog break; case WM_RBUTTONDOWN: CMenu pMenu; if(pMenu.LoadMenu(IDR_MENU1)) { CMenu* pPopupMenu = pMenu.GetSubMenu(0); ASSERT(pPopupMenu != NULL); CPoint point; GetCursorPos(&point); SetForegroundWindow(); pPopupMenu->TrackPopupMenu( TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); } Shell_NotifyIcon(NIM_SETFOCUS, &m_notifyIcon); break; } return 0; }

6,此时,程序运行可以实现在任务栏图标的显示,但如果Windows explorer进程被杀死,再恢复后托盘消失,只能通过进程管理器关闭该程序

解决办法:

在对话框cpp文件开始处添加下面语句:

 

static const UINT WM_TABCREAT =::RegisterWindowMessage(_T("TaskbarCreated"));

WM_TABCREAT为一Windows消息,添加该消息的映射函数:
ON_REGISTERED_MESSAGE(WM_TABCREAT,OnTaskBarCreated)
实现其功能如下即可:
LRESULT CMyplayDlg::OnTaskBarCreated(WPARAM wParam,LPARAM IParam)
{
    Shell_NotifyIcon(NIM_ADD , &m_notifyIcon);
return 0;
}

 

评论

此博客中的热门博文

民国教材胜在情怀