Winapi 在win7上使用TrackPopupMenu时出现问题

Winapi 在win7上使用TrackPopupMenu时出现问题,winapi,mfc,contextmenu,aero,Winapi,Mfc,Contextmenu,Aero,我试图在我的应用程序中使用TrackPopupMenu函数创建上下文菜单,其中使用的代码如下所示: CMenu menu; if (menu.LoadMenu(IDR_MENU_TRAY)) { CMenu* pSubMenu = menu.GetSubMenu(0); if (pSubMenu != NULL) { pSubMenu->ModifyMen

我试图在我的应用程序中使用TrackPopupMenu函数创建上下文菜单,其中使用的代码如下所示:

CMenu menu;
        if (menu.LoadMenu(IDR_MENU_TRAY))
        {
            CMenu* pSubMenu = menu.GetSubMenu(0);
            if (pSubMenu != NULL)
            {
                pSubMenu->ModifyMenu(IDM_CLOSE,MF_BYCOMMAND,IDM_CLOSE ,g_cfg->GetLang(TEXT_MAIN_CLOSE,"Exit(&X)")); 
                pSubMenu->ModifyMenu(IDM_SHOW,MF_BYCOMMAND,IDM_SHOW ,g_cfg->GetLang(TEXT_MAIN_OPEN_SHUTTER,"Open(&O)"));
                CPoint point;
                GetCursorPos(&point);                                                                   
                SetForegroundWindow();  
                pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, messageOnlyWnd); 
            }
        }

该代码在WinXP上运行完美,而在win7和vista上则不然。win7和vista的问题是弹出菜单需要相当长的时间,可能需要1分钟或更长时间。但是如果我在win7或vista上关闭Aero,它会像在winXP上一样平稳运行,所以我猜代码中一定有与Aero冲突的地方,但我只是不知道如何修复它。有人能帮我吗?如果有人能帮助我,我将不胜感激。

我看不出这段代码有任何错误。我在Vista上使用了
TrackPopupMenu
,没有任何问题。问题的根源可能在别处。尝试删除对
SetForegroundWindow
的调用。如果不起作用,请尝试仅使用弹出菜单代码创建一个空项目。

谢谢您的回答。我按照你的建议试过了,但问题仍然存在。使用弹出菜单代码创建空项目在Aero打开的win7上可以顺利工作。在我的应用程序中,即使在CEdit控件中单击鼠标右键时弹出菜单,也需要相当长的时间才能显示菜单。但是当Aero关闭时,一切都正常。此外,在创建弹出菜单时,除了TrackPopupMenu函数外,我没有使用任何其他LIB或代码,所以我很长时间对它感到困惑。它让我发疯!!如果不查看代码的其余部分,就很难进一步诊断。应用程序是否在主线程中进行后台处理?这可能会减慢GUI的速度。它确实会进行一些后台处理,但我无法理解的是,在关闭Aero的情况下,它可以在WinXP和Win7上顺利运行,但在创建弹出菜单时,在打开Aero的情况下,它不能在Win7上顺利运行。所以我猜Win7中的Aero和函数TrackPopupMenu之间可能存在冲突。我还使用VS2003在我的代码中设置了一些断点,发现除了使用TrackPopupMenu的代码外,其他代码都运行得很顺利,这需要1分钟才能完成!什么样的背景处理?我建议你将代码转移到一个单独的线程中,类似于套接字通信,它确实在一个单独的线程中运行,所以我认为这并不重要。我认为最有可能的是Win7中的Aero与TrackPopupMenu函数之间存在一些冲突,我无法理解。PS:我在应用程序中也使用GDI+和DirectShow LIB,但我没有使用它们来呈现弹出菜单。只有MFC功能(如TrackPopupMenu)用于创建菜单。