VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: wangwei1202

右键单击,偶尔会同时显示托盘系统菜单和本身的弹出菜单,怎么解决?

[复制链接]

0

主题

18

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-7-22 06:30:01 | 显示全部楼层
英语看不懂!
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-7-25 18:30:01 | 显示全部楼层
试试这个代码
在菜单弹出之前
::SetForegroundWindow(m_nid.hWnd);   
弹出菜单之后
::PostMessage(m_nid.hWnd, WM_NULL, 0, 0);
回复

使用道具 举报

2

主题

15

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-8-6 10:00:01 | 显示全部楼层
不行,问题依旧。
恳请高人指点...
回复

使用道具 举报

0

主题

57

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-8-6 19:30:02 | 显示全部楼层
你在相应右键消息的时候,干了些什么,代码看看
回复

使用道具 举报

0

主题

30

帖子

22.00

积分

新手上路

Rank: 1

积分
22.00
发表于 2020-8-6 20:00:01 | 显示全部楼层
目前,这不是一个system bug
应该是用户点击位置不对,或你程序本身错误.
回复

使用道具 举报

2

主题

15

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-8-6 23:45:01 | 显示全部楼层
请帮忙指点,下面是我的托盘实现类:
////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include "TrayIcon.h"
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 初始化
CTrayIcon::CTrayIcon()
{
        m_bHealth = TRUE;
}
CTrayIcon::~CTrayIcon()
{
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 右键菜单
VOID CTrayIcon::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
        if(wParam != m_nid.uID)
                return;
       
        SetForegroundWindow(m_nid.hWnd);
       
        switch(LOWORD(lParam))
        {
    case WM_RBUTTONUP:{
                // 过滤系统菜单
                /*
                HWND hTray = FindWindow(TEXT("Shell_TrayWnd"), NULL);
                hTray = FindWindowEx(hTray, NULL, TEXT("TrayNotifyWnd"), NULL);
                DestroyMenu( GetMenu(hTray) );
                hTray = NULL;
                */
                // 显示菜单
                HMENU hMenuMain = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(m_nid.uID));
                if(hMenuMain == NULL)
                        return;
                HMENU hMenuTray = GetSubMenu(hMenuMain, 0);
                if(hMenuTray == NULL)
                        return;
                POINT point;
                GetCursorPos(&point);
                // 健康助手是否启用
                UINT Checked = m_bHealth ? MF_CHECKED : MF_UNCHECKED;
                CheckMenuItem(hMenuTray, IDM_App_Health, MF_BYCOMMAND | Checked);
                // 暂停过期提醒
                BOOL bPause = CIniFile::ReadInteger(TEXT("TEMP"), TEXT("PAUSEREMIND"), 0);
                Checked = bPause ? MF_CHECKED : MF_UNCHECKED;
                CheckMenuItem(hMenuTray, IDM_App_PauseRemind, MF_BYCOMMAND | Checked);
                // 托盘图标是否选中
                BOOL bIcon = CIniFile::ReadInteger(TEXT("GLOBAL"), TEXT("TrayIcon"), 1);
                Checked = bIcon ? MF_CHECKED : MF_UNCHECKED;
                CheckMenuItem(hMenuTray, IDM_App_TrayIcon, MF_BYCOMMAND | Checked);
                // 低网速关机是否启用
                BOOL bNetSpeed = CIniFile::ReadInteger(TEXT("SHUTDOWN"), TEXT("NetSpeedShut"), 0);
                Checked = bNetSpeed ? MF_CHECKED : MF_UNCHECKED;
                CheckMenuItem(hMenuTray, IDM_App_NetSpeed, MF_BYCOMMAND | Checked);
                // 设置菜单粗体显示
                MENUITEMINFO mmi = {sizeof(MENUITEMINFO)};
                mmi.fMask = MIIM_STATE;
                mmi.fState = MFS_DEFAULT;
                SetMenuItemInfo(hMenuMain, IDM_App_Setting, FALSE, &mmi);
                SetMenuItemInfo(hMenuMain, IDM_App_Remind, FALSE, &mmi);
                // 显示菜单
                TrackPopupMenu(hMenuTray, 0, point.x, point.y, 0, m_nid.hWnd, NULL);
                PostMessage(m_nid.hWnd, WM_NULL, 0, 0);
                // 销毁
                DestroyMenu(hMenuTray);
                DestroyMenu(hMenuMain);
                break;}

        case WM_LBUTTONDBLCLK:
                if(m_DbClickMenuItem != 0)
                        SendMessage(m_nid.hWnd, WM_COMMAND, m_DbClickMenuItem, 0);
                break;
               
        case WM_LBUTTONUP:
                if (m_LeftClickMenuItem != 0)
                        SendMessage(m_nid.hWnd, WM_COMMAND, m_LeftClickMenuItem, 0);
                break;
        }
        //CSystemTray::OnTrayNotify(wParam, lParam);
}
////////////////////////////////////////////////////////////////////////////////////////
下面和托盘菜单无关,省略.................
回复

使用道具 举报

2

主题

15

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-8-7 00:30:01 | 显示全部楼层
////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include "SysTray.h"
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 初始化
CSystemTray::CSystemTray()
{
        m_DbClickMenuItem        = 0;
        m_LeftClickMenuItem        = 0;
        m_IconCount                        = 0;
        m_TimerId                        = 0;
        m_pIconList                        = NULL;
}

CSystemTray::~CSystemTray()
{
        if(m_pIconList != NULL)
                delete m_pIconList;
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 创建托盘图标
BOOL CSystemTray::Create(HWND hWndParent, UINT CallbackMessage, const TCHAR *pToolTip,
                                                 HICON hIcon, UINT MenuID)
{
        assert(CallbackMessage >= WM_USER);
        assert(lstrlen(pToolTip) < 128);
        m_nid.cbSize                        = sizeof(m_nid);
        m_nid.uCallbackMessage        = CallbackMessage;
        m_nid.uFlags                        = NIF_ICON | NIF_TIP;
        m_nid.hIcon                                = hIcon;
        m_nid.hWnd                                = hWndParent;
        m_nid.uID                                = MenuID;
        lstrcpyn(m_nid.szTip, pToolTip, 128);
        return Shell_NotifyIcon(NIM_ADD, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 添加托盘消息响应
BOOL CSystemTray::EnableTrayMessage()
{
        m_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
        return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 设置右键菜单
BOOL CSystemTray::SetMenu(UINT MenuID)
{
        m_nid.uID = MenuID;
       
        return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 右键菜单消息响应
VOID CSystemTray::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
        if(wParam != m_nid.uID)
                return;
       
        SetForegroundWindow(m_nid.hWnd);
       
        switch(LOWORD(lParam))
        {
    case WM_RBUTTONUP:{
                HMENU hMenuMain = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(m_nid.uID));
                if(hMenuMain == NULL)
                        return;
                HMENU hMenuTray = GetSubMenu(hMenuMain, 0);
                if(hMenuTray == NULL)
                        return;
                POINT MousePos;
                GetCursorPos(&MousePos);
                // 显示
                TrackPopupMenu(hMenuTray, 0, //TPM_CENTERALIGN | TPM_RIGHTBUTTON,
                        MousePos.x, MousePos.y, 0, m_nid.hWnd, NULL);
                // 销毁
                DestroyMenu(hMenuTray);
                DestroyMenu(hMenuMain);
                break;}
               
    case WM_LBUTTONDBLCLK:
                if(m_DbClickMenuItem != 0)
                        SendMessage(m_nid.hWnd, WM_COMMAND, m_DbClickMenuItem, 0);
                break;
               
    case WM_LBUTTONUP:
                if(m_LeftClickMenuItem != 0)
                        SendMessage(m_nid.hWnd, WM_COMMAND, m_LeftClickMenuItem, 0);
                break;
        }
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 删除托盘图标
VOID CSystemTray::RemoveIcon()
{
        Shell_NotifyIcon(NIM_DELETE, &m_nid);
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 设置托盘提示信息
BOOL CSystemTray::SetTooltipText(const TCHAR *pToolTips)
{
        m_nid.uFlags = NIF_TIP;
        lstrcpyn(m_nid.szTip, pToolTips, 128);
       
        return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 托盘气球提示
BOOL CSystemTray::ShowBalloonTip(LPCTSTR lpszTitle, LPCTSTR lpszMsg, DWORD dwInfoFlags, UINT nTimeout/*=3000*/)
{
        if(!(m_nid.uFlags & NIF_INFO))
                m_nid.uFlags |= NIF_INFO;
        m_nid.uTimeout = nTimeout;
        m_nid.dwInfoFlags = dwInfoFlags;
        lstrcpy(m_nid.szInfoTitle, lpszTitle);
        lstrcpy(m_nid.szInfo, lpszMsg);
               
        return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 设置托盘图标
BOOL CSystemTray::SetIcon(HICON hIcon)
{
        m_nid.uFlags = NIF_ICON;
        m_nid.hIcon = hIcon;
       
        return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
BOOL CSystemTray::SetIcon(UINT IconID)
{
        HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IconID));
        assert(hIcon != NULL);
       
        return SetIcon(hIcon);
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 创建托盘动态图标列表
BOOL CSystemTray::CreateIconList(UINT FirstIconID, UINT LastIconID)
{
        m_IconCount = LastIconID - FirstIconID + 1;
        assert(m_IconCount > 1 && m_IconCount <= 20);
       
        if(m_pIconList != NULL)
                delete m_pIconList;
       
        m_pIconList = new HICON[m_IconCount];
        assert(m_pIconList != NULL);
       
        HINSTANCE hInstance = GetModuleHandle(NULL);
        for(UINT CurIconID = FirstIconID; CurIconID <= LastIconID; CurIconID++)
        {
                HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(CurIconID));
                assert(hIcon != NULL);
               
                m_pIconList[CurIconID - FirstIconID] = hIcon;
        }
       
        return true;
}
////////////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////////////
// 托盘动态图标
static CSystemTray *pThis = NULL;
static VOID CALLBACK AnimateTimerProc(HWND hWnd, UINT Msg, UINT_PTR IdEvent, DWORD Time)
{
        if(pThis == NULL)
                return;
       
        static INT Steps = 0;
        pThis->SetIcon(pThis->m_pIconList[Steps]);
       
        Steps++;
        if(Steps >= pThis->m_IconCount)
                Steps = 0;
}
BOOL CSystemTray::BeginAnimate(UINT DelayMilliSeconds)
{
        assert(m_pIconList != NULL);
        if(m_pIconList == NULL)
                return false;
       
        pThis = this;
       
        m_TimerId = (UINT)SetTimer(NULL, 0, DelayMilliSeconds, (TIMERPROC)AnimateTimerProc);
        return m_TimerId != 0;
}
VOID CSystemTray::StopAnimate()
{
        assert(m_TimerId != 0);
        if(m_TimerId == 0)
                return;
       
        KillTimer(NULL, m_TimerId);
        m_TimerId = 0;
}
////////////////////////////////////////////////////////////////////////////////////////

回复

使用道具 举报

0

主题

57

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-8-7 02:00:01 | 显示全部楼层
SetForegroundWindow(hDlg);

PostMessage(hDlg, WM_NULL, 0, 0);

还是没有加嘛
回复

使用道具 举报

2

主题

15

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-8-7 10:15:02 | 显示全部楼层
不对,我是从CSysTray类继承到CTrayIcon。

在CTrayIcon里响应右键菜单。
回复

使用道具 举报

2

主题

15

帖子

10.00

积分

新手上路

Rank: 1

积分
10.00
 楼主| 发表于 2020-8-7 10:30:01 | 显示全部楼层
SetForegroundWindow(hDlg);

PostMessage(hDlg, WM_NULL, 0, 0);

加在了CTrayIcon里。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表