C++ IContextMenu::QueryContextMenu返回不相关菜单
根据连接状态(已连接/已断开),网络连接快捷方式(以太网、Wi-Fi等)具有不同的上下文菜单。 我使用以下代码(Delphi)检索并显示此菜单C++ IContextMenu::QueryContextMenu返回不相关菜单,c++,delphi,winapi,contextmenu,windows-shell,C++,Delphi,Winapi,Contextmenu,Windows Shell,根据连接状态(已连接/已断开),网络连接快捷方式(以太网、Wi-Fi等)具有不同的上下文菜单。 我使用以下代码(Delphi)检索并显示此菜单 var pidl, child: PItemIdList; pFolder: IShellFolder; pMenu: IContextMenu; menu: HMENU; begin SHParseDisplayName(PChar('%USERPROFILE%\Desktop\eth0.lnk'), nil, pidl,
var pidl, child: PItemIdList;
pFolder: IShellFolder;
pMenu: IContextMenu;
menu: HMENU;
begin
SHParseDisplayName(PChar('%USERPROFILE%\Desktop\eth0.lnk'), nil, pidl, 0, PDWORD(nil)^);
SHBindToParent(pidl, IID_IShellFolder, Pointer(pFolder), child);
CoTaskMemFree(pidl);
pFolder.GetUIObjectOf(0, 1, child, IID_IContextMenu, nil, pMenu);
menu := CreatePopupMenu;
pMenu.QueryContextMenu(menu, 0, 0, $7fff, CMF_NORMAL);
TrackPopupMenuEx(menu, TPM_LEFTBUTTON, 0, 0, Handle, nil);
DestroyMenu(menu);
end;
但是在改变了连接状态之后,我继续得到旧的菜单。在重启我的应用程序之后。
有时在重新启动我的应用程序后,我会得到正确的菜单
为什么会发生这种情况以及如何解决
操作系统:32位和64位Windows 7/8/10
C++代码:
PIDLIST\u绝对pidl;
如果成功(SHParseDisplayName(L“%USERPROFILE%\\Desktop\\eth0.lnk”,NULL,&pidl,0,NULL))
{
PCUITEMID_儿童;
CComQIPtr-pFolder;
如果成功(SHBindToParent(pidl、IID_IShellFolder、(void**)和pFolder及child))
{
CComQIPtr pMenu;
如果成功(pFolder->GetUIObjectOf(0、1和子对象,IID_IContextMenu,NULL,(void**)和pMenu))
{
HMENU菜单=CreatePopupMenu();
如果成功(pMenu->QueryContextMenu(菜单,0,0,0x7fff,CMF_正常))
TrackPopupMenuEx(菜单,TPM_左按钮,0,0,hWnd,NULL);
菜单(菜单);
}
}
CoTaskMemFree(pidl);
}
添加:
也许是Windows bug。来自internet和文件管理器的任何示例,如Explorer(XYPlorer、Explorer++,等等),都有相同的问题。现在我在Windows10Explorer上看到了同样的问题。如果您通过拖放从桌面上的“控制面板\所有控制面板项目\网络和共享中心\更改适配器设置\适配器名称”创建到网络连接的快捷方式,您将看到相同的问题。在资源管理器中菜单是否立即更新?也许只需要一点时间。是的,菜单会在浏览器中立即更新。Shell扩展没有这个问题,例如经典的Shell-开始菜单,但是如果它在一个单独的进程(不是Explorer.exe)中运行,它也会有同样的问题。