Ярлык сетевого подключения (Ethernet, 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
Код С++:
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. Любые примеры из Интернета и файловых менеджеров, таких как Explorer (XYPlorer, Explorer ++ и т.д.), Имеют одинаковую проблему. Теперь я вижу ту же проблему в Windows 10 Explorer. Если вы нажмете ярлык "Drag & Drop" на сетевое подключение "Панель управления\Все элементы панели управления\Центр управления сетью и общим доступом\Изменить настройки адаптера\имя_компьютера" на рабочем столе, вы увидите ту же проблему.