使用 Shell_NotifyIcon 的两点注意

1. 建立结构体的时候:


NOTIFYICONDATA m_notifyData;
m_notifyData.cbSize = sizeof(NOTIFYICONDATA );

很多例子都是这么写 cbSize 的,但是一旦使用了 VS 2008 或者更高版本,你会发现这样的系统托盘图标在 XP 系统上无法弹出气泡提示,其实 cbSize 像下面这样赋值

m_notifyData.cbSize = NOTIFYICONDATA_V2_SIZE;

NOTIFYICONDATA_V2_SIZE 是 XP 可以接受的,当然这样做可能会丢失一些高级功能。

2. 处理点击托盘图标弹出菜单的时候:

不少例子是类似这样写的

LRESULT CDialupCppDlg::OnTrayMsg(WPARAM wParam, LPARAM lParam)
{
UINT uID = (UINT)wParam;
UINT uMouseMsg = (UINT)lParam;
CMenu menu;
CMenu *pMenu;
POINT pt;

if(uMouseMsg == WM_RBUTTONDOWN || uMouseMsg == WM_LBUTTONDOWN) // 如果是单击左右键
{
switch(uID)
{
case IDR_MAINFRAME:
GetCursorPos(&pt); // 取得鼠标位置
//执行相应操作
menu.LoadMenu(IDR_MENU_POP);
pMenu = menu.GetSubMenu(0);
ASSERT(pMenu!=0);
pMenu->TrackPopupMenu(0, pt.x, pt.y, this);
break;
}
}

return 0;
}

你会发现弹出的菜单,点击其它空白位置的时候,它并不会消失

需要在 pMenu->TrackPopupMenu(0, pt.x, pt.y, this); 加一行

::SetForegroundWindow(m_hWnd);
pMenu->TrackPopupMenu(0, pt.x, pt.y, this);

加入对话

1条评论

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据