Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ IContextMenu::QueryContextMenu返回不相关菜单_C++_Delphi_Winapi_Contextmenu_Windows Shell - Fatal编程技术网

C++ IContextMenu::QueryContextMenu返回不相关菜单

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,

根据连接状态(已连接/已断开),网络连接快捷方式(以太网、Wi-Fi等)具有不同的上下文菜单。 我使用以下代码(Delphi)检索并显示此菜单

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)中运行,它也会有同样的问题。