最小化托盘,一闪而过,哪里问题?

O112358 2010-08-10 01:05:43
通过调用dll的函数实现程序添加到托盘,到托盘的函数及消息响应程序都在dll里。该dll为全局一起动程序便加载的。程序一起动便加载到托盘,为什么一闪而过?
ToTray(HWND hWnd, UINT uID,UINT uFlags,UINT uCallbackMessage, CString Tip, CString InfoTitle ,CString sInfo)
我是放在OnInitDialog()下的:ToTray(::GetActiveWindow(),IDR_MAINFRAME,NULL,WM_SHOW_MY_MASSGGE,_T("ESP2010已最小化到托盘"),_T("ESP"),_T("ESP2010"));
有消息映射,但由于没运行到那,无从测试。

下面为相关code
// 加载到托盘
BOOL ToTray(HWND hWnd, UINT uID,UINT uFlags,UINT uCallbackMessage, CString Tip, CString InfoTitle ,CString sInfo)
{
AppInfo.Ava.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
AppInfo.Ava.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO;
AppInfo.Ava.uCallbackMessage=WM_SHOW_MY_MASSGGE;
AppInfo.Ava.hWnd=hWnd;
AppInfo.Ava.uID=uID;
AppInfo.Ava.uFlags=uFlags;
AppInfo.Ava.dwState=NIS_HIDDEN;
AppInfo.Ava.dwStateMask=NIS_HIDDEN;
AppInfo.Ava.uTimeout=20;
AppInfo.Ava.uFlags=NOTIFYICON_VERSION;
AppInfo.Ava.uCallbackMessage=uCallbackMessage;
AppInfo.Ava.uVersion=NIIF_INFO;
AppInfo.Ava.hIcon=::LoadIconW(::AfxGetInstanceHandle(),MAKEINTRESOURCE(uID));
::wcscpy_s(AppInfo.Ava.szInfoTitle,InfoTitle);
::wcscpy_s(AppInfo.Ava.szInfo,sInfo);
::wcscpy_s(AppInfo.Ava.szTip,Tip);
Shell_NotifyIcon(NIM_ADD,&AppInfo.Ava); //在托盘区添加图标
//ShowWindow(AppInfo.Ava.hWnd,SW_HIDE);//隐藏主窗口
return 0;
}

LRESULT AppFrm::RButtonEvent(UINT MId, UINT TId, LPPOINT lpoint, WPARAM wParam, LPARAM lParam, CMenu *PopMenu, CWnd *pWnd)//OnShowMyMessage
{
if(PopMenu->CreatePopupMenu())//DefaultMenu
{
PopMenu->AppendMenuW(MF_BYCOMMAND|MF_STRING,ID_POPM_IITEM_0,_T("恢复窗口"));
PopMenu->AppendMenuW(MF_BYCOMMAND|MF_MENUBARBREAK|MF_STRING,ID_POPM_IITEM_1,_T("关于我们"));
PopMenu->AppendMenuW(MF_BYCOMMAND|MF_STRING,ID_POPM_IITEM_2,_T("系统设置"));
PopMenu->AppendMenuW(MF_BYCOMMAND|MF_MENUBARBREAK|MF_STRING,ID_POPM_IITEM_3,_T("退出程序"));
}
if(wParam!=MId)
return true;

switch(lParam)
{
case WM_RBUTTONUP:
::GetCursorPos(lpoint);
if(!TId)
{
PopMenu->LoadMenuW(TId);
PopMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,lpoint->x,lpoint->y,pWnd,NULL);
}
else
PopMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,lpoint->x,lpoint->y,pWnd,NULL);
PopMenu->Detach();
//....

PopMenu->DestroyMenu();
break;
case WM_LBUTTONDBLCLK:
::ShowWindow(::GetActiveWindow(),SW_NORMAL);
break;
case WM_LBUTTONDOWN:
::ShowWindow(::GetActiveWindow(),SW_HIDE);
break;
default :
break;
}
return LRESULT();
}

// 自定义消息响应函数(托盘消息)
LRESULT CEPSDlg::OnShowMessage(WPARAM wParam, LPARAM lParam)
{
CMenu *PopMenu;
PopMenu=new CMenu();
LPPOINT LPoint;
LPoint=new tagPOINT;
UINT TId=0;
::GetCursorPos(LPoint);
RButtonEvent(IDR_MAINFRAME,TId,LPoint,NULL,lParam,PopMenu,this);
delete LPoint;
delete PopMenu;
return LRESULT();
}
...全文
120 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
O112358 2010-08-12
  • 打赏
  • 举报
回复
沉得快啊。。。
O112358 2010-08-10
  • 打赏
  • 举报
回复
回4楼的话:那个函数确实有点错,if(!TId)...改为if(TId)...就对了,对此我还特地去测试了下,我那写法基本没问题,就是那个菜单丑了点,不过貌似还蛮对称的,嘿嘿。。。
右键函数其实还没写完,点击选项功能还没写的,你那个也行。我想你也试过了,但是我想你应该没用动态连接库,我那个应用一点反应也没。那个托盘加载依旧是那样(他与消息响应没关系,因为消息响应是你之后点击等触发了他才会调用,所以这两个可以算两码事)。我分别都测试过了,直接使用一切正常!!!不过对于加载到托盘的函数有解决方法:把它放到OnPaint()里就没问题了,只要在OnPaint()里別放错位置即可。
O112358 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feng0112358 的回复:]
引用 1 楼 fangongdalu7148 的回复:
楼主 是怎么个一闪而过?

鼠标放上去就没了,因为我没添加删除托盘图片的功能,鼠标放上去,就没了;如果添加了自然是一闪而过了。
我没看出不对劲的地方,不知为什么?
[/Quote]
肯定还在运行了,否则我还来问?其实我落了点没说,到托盘功能函数在OnPaint()可以,但不知在此时化那闪一下就没了。。。
zgsdzhaolanxiang1 2010-08-10
  • 打赏
  • 举报
回复
ToTray 这里没问题,,问题应该出在这个函数里 OnShowMessage,,楼主参考我的代码看看。
LRESULT CMyDlg::OnTrayNotification(WPARAM wId, LPARAM lEvent)
{
if(wId!=m_nid.uID
|| (lEvent!=WM_LBUTTONUP && lEvent!=WM_RBUTTONUP))
return 0;
//加载菜单
CMenu menu;
if(!menu.LoadMenu(wId))
return 0;
//获取弹出菜单
CMenu *pSubMenu = menu.GetSubMenu(0);
if(!pSubMenu)
return 0;

if(lEvent == WM_RBUTTONUP)
{
//设置默认菜单项
::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);

//获取鼠标位置
CPoint mouse;
GetCursorPos(&mouse);

//设置快捷菜单
::SetForegroundWindow(m_nid.hWnd);
::TrackPopupMenu(pSubMenu->m_hMenu, 0, mouse.x, mouse.y, 0, m_nid.hWnd, NULL);
}
else
{
::SendMessage(m_nid.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0);
}

return 1;
}
zgsdzhaolanxiang1 2010-08-10
  • 打赏
  • 举报
回复
那你程序还在运行吗??你鼠标放上去 托盘没了 说明托盘早就不存在了..
O112358 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fangongdalu7148 的回复:]
楼主 是怎么个一闪而过?
[/Quote]
鼠标放上去就没了,因为我没添加删除托盘图片的功能,鼠标放上去,就没了;如果添加了自然是一闪而过了。
我没看出不对劲的地方,不知为什么?
zgsdzhaolanxiang1 2010-08-10
  • 打赏
  • 举报
回复
楼主 是怎么个一闪而过?

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧