В Windows отсутствует контекстное меню.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 В Windows отсутствует контекстное меню.

Сообщение Anonymous »

Я пытаюсь получить доступ к контекстному меню файла в Windows 11, используя следующий код:

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

bool openShellContextMenuForObject(const std::wstring& path, int xPos, int yPos, void* parentWindow)
{
ITEMIDLIST* id = 0;
std::wstring windowsPath = path;
std::replace(windowsPath.begin(), windowsPath.end(), '/', '\\');
HRESULT result = SHParseDisplayName(windowsPath.c_str(), 0, &id, 0, 0);
if (!SUCCEEDED(result) || !id)
return false;
//CItemIdListReleaser idReleaser(id);

IShellFolder* ifolder = 0;

LPCITEMIDLIST idChild = 0;
result = SHBindToParent(id, IID_IShellFolder, (void**)&ifolder, &idChild);
if (!SUCCEEDED(result) || !ifolder)
return false;
//CComInterfaceReleaser ifolderReleaser(ifolder);

IContextMenu* imenu = 0;
result = ifolder->GetUIObjectOf((HWND)parentWindow, 1, (const ITEMIDLIST**)&idChild, IID_IContextMenu, 0, (void**)&imenu);
if (!SUCCEEDED(result) || !ifolder)
return false;
//CComInterfaceReleaser menuReleaser(imenu);

HMENU hMenu = CreatePopupMenu();
if (!hMenu)
return false;

if (SUCCEEDED(imenu->QueryContextMenu(hMenu, 0, 1, 0x7FFF, CMF_NORMAL)))
{
int iCmd = TrackPopupMenuEx(hMenu, TPM_RETURNCMD, xPos, yPos, (HWND)parentWindow, NULL);

if (iCmd > 0)
{
CMINVOKECOMMANDINFOEX info = { 0 };
info.cbSize = sizeof(info);
info.fMask = CMIC_MASK_UNICODE;
info.hwnd = (HWND)parentWindow;
info.lpVerb = MAKEINTRESOURCEA(iCmd - 1);
info.lpVerbW = MAKEINTRESOURCEW(iCmd - 1);
info.nShow = SW_SHOWNORMAL;
imenu->InvokeCommand((LPCMINVOKECOMMANDINFO)&info);
}
}
DestroyMenu(hMenu);

return true;
}

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR, int nShowCmd) {
const char CLASS_NAME[] = "SampleWindowClass";

WNDCLASSA wc = {};
wc.lpfnWndProc = DefWindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;

RegisterClassA(&wc);

HWND hwnd = CreateWindowExA(
0, CLASS_NAME, "Window", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL
);

ShowWindow(hwnd, nShowCmd);
UpdateWindow(hwnd);

openShellContextMenuForObject(L"C:\\Users\\Admin\\Desktop\\file.txt", 100, 100, hwnd);

MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}
Все в порядке, кроме отсутствия подменю «Предоставить доступ».
[img]https://i.sstatic.net /Tp3fhUFJ.png[/img]

Любые другие подменю работают нормально и отображают подменю правильно, но не отображаются только подменю «Предоставить доступ». Показывает пустое подменю. Как я могу это исправить?

Подробнее здесь: https://stackoverflow.com/questions/793 ... in-windows
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»