网络连接快捷方式(以太网、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;
但是在改变连接状态后,我总是看到旧的菜单。重启应用程序后,我有时会看到正确的菜单,但大多数时候我不会。
为什么会发生这种情况,如何解决?
操作系统:Windows 7/8/10操作系统
C++代码:
PIDLIST_ABSOLUTE pidl;
if SUCCEEDED(SHParseDisplayName(L"%USERPROFILE%\\Desktop\\eth0.lnk", NULL, &pidl, 0, NULL))
{
PCUITEMID_CHILD child;
CComQIPtr<IShellFolder> pFolder;
if SUCCEEDED(SHBindToParent(pidl, IID_IShellFolder, (void**)&pFolder, &child))
{
CComQIPtr<IContextMenu> pMenu;
if SUCCEEDED(pFolder->GetUIObjectOf(0, 1, &child, IID_IContextMenu, NULL, (void**)&pMenu))
{
HMENU menu = CreatePopupMenu();
if SUCCEEDED(pMenu->QueryContextMenu(menu, 0, 0, 0x7fff, CMF_NORMAL))
TrackPopupMenuEx(menu, TPM_LEFTBUTTON, 0, 0, hWnd, NULL);
DestroyMenu(menu);
}
}
CoTaskMemFree(pidl);
}
**添加:**可能是Windows bug。任何来自互联网和文件管理器(如资源管理器(XYPlorer、资源管理器++等)的示例都有同样的问题。现在我在Windows 10资源管理器上看到了同样的问题。如果您通过拖放从桌面上的“控制面板\所有控制面板项目\网络和共享中心\更改适配器设置\适配器名称”创建一个网络连接的快捷方式,您将看到同样的问题。
1条答案
按热度按时间jfgube3f1#
我认为这个问题与缓存的网络连接快捷方式的上下文菜单信息有关,当你改变连接状态时,windows可能不会自动刷新缓存的信息。
您可能需要通过调用function
SHChangeNotify
手动刷新该高速缓存,它将通知系统应用程序执行的事件并触发缓存刷新。下面是 Delphi 中的一个例子:
在C++中:
若要确保上下文菜单是最新的,请在显示之前尝试调用
SHChangeNotify
。