mfcc++托盘应用程序问题

MFC C++ Tray Application Issue

本文关键字:问题 应用程序 mfcc++      更新时间:2023-10-16

我正在创建一个mfc应用程序的任务栏图标,在MyView.cpp文件中我已经写了

    static const UINT WMU_NOTIFY_TASKBAR_ICON = ::RegisterWindowMessage(_T("NOTIFY_TASKBAR_ICON"));
    IMPLEMENT_DYNCREATE(CMyView, CView)
    BEGIN_MESSAGE_MAP(CMyView, CView)
         // Standard printing commands
         ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
         ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
         ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
         // added messages by the developer
         ON_REGISTERED_MESSAGE(WMU_NOTIFY_TASKBAR_ICON, OnNotifyTaskbarIcon)
    END_MESSAGE_MAP()
    //...
    void CMyView::AddTaskbarIcon()
    {
         DWORD dwMessage = NIM_ADD;
         NOTIFYICONDATA nid;
         nid.cbSize = sizeof(NOTIFYICONDATA);
         nid.hWnd = HWND(AfxGetApp()->m_pMainWnd);
         nid.uID = 0;
         nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
         nid.uCallbackMessage = WMU_NOTIFY_TASKBAR_ICON;
         nid.hIcon = LoadIcon(GetModuleHandle(0), MAKEINTRESOURCE(IDI_SS_ICON));
         nid.dwInfoFlags = NIIF_INFO;
         ::Shell_NotifyIconW(dwMessage, &nid);
    }
    LRESULT CMyView::OnNotifyTaskbarIcon( WPARAM wParam, LPARAM lParam )
    {
        UINT uID = (UINT)wParam;
        UINT uMouseMsg = (UINT)lParam;
        switch(uMouseMsg)
        {
        case WM_LBUTTONDOWN:
            break;
        case WM_LBUTTONDBLCLK:
            //if(IsIconic())
            {
                break;
            }
        case WM_RBUTTONDOWN:
            {
                // must be implemented:
                // app popup menu will be showed
                CMenu* pMenu = GetMenu();
                if( pMenu )
                {
                    CMenu *pSubMenu = NULL;
                    pSubMenu = pMenu->GetSubMenu( 0 );
                    {
                        SetForegroundWindow(); // *** little patch here ***             
                        POINT pointCursor;             
                        ::GetCursorPos( &pointCursor );            
                        pSubMenu->TrackPopupMenu( TPM_RIGHTALIGN, 
                            pointCursor.x, pointCursor.y, 
                            this );
                    }
                }
            }
            break;
        case WM_RBUTTONDBLCLK:
            break;
        case WM_MOUSEMOVE:
            break;
        }
        return 0L;
    }

和My.cpp

    BOOL CMyApp::InitInstance()
    {
            //...
            myViewPtr->AddTaskbarIcon();
            //...
    }

应用程序启动,图标出现在任务栏上,但鼠标悬停时它就消失了。我做错什么了吗?谢谢

AfxGetApp()->m_pMainWnd指向主框架窗口,而不是视图。我怀疑框架窗口正在接收WMU_NOTIFY_TASKBAR_ICON消息,而没有处理它,所以Windows删除了图标。

您可以在框架窗口类中处理消息,或者将句柄传递给视图,像这样:

void CMyView::AddTaskbarIcon()
{
     ...
     nid.hWnd = GetSafeHwnd();
     ...
}