最小化托盘,一闪而过,哪里问题?
通过调用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();
}