Как добавить несколько пунктов меню в расширение оболочки Windows?

Я пытаюсь добавить несколько пунктов меню в контекстное меню оболочки Windows.
До сих пор я делал следующий код, он добавляет мои элементы в качестве подменю, в то время как я хочу, чтобы они были в главном контекстном меню.
Вот картинка:
Что я имею против того, что я хочу

Есть идеи? Спасибо!

STDMETHODIMP CFileFavShellExt::QueryContextMenu (HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd, UINT uidLastCmd, UINT uFlags )
{
// This is not our business.
if (CMF_DEFAULTONLY & uFlags)
{
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
}

UINT uID = uidFirstCmd;

if (!InsertMenu(hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL))
{
return HRESULT_FROM_WIN32(GetLastError());
}

// Creating my menu.
HMENU hSubmenu = CreateMenu();

InsertMenu (hSubmenu, 0, MF_BYPOSITION, uID++, _T("Add to bookmarks 1"));
InsertMenu (hSubmenu, 1, MF_BYPOSITION, uID++, _T("Add to bookmarks 2"));

MENUITEMINFO mii = { sizeof(mii) };
mii.fMask = MIIM_SUBMENU | MIIM_ID | MIIM_STRING;
mii.hSubMenu = hSubmenu;
mii.fType = MFT_STRING;
mii.dwTypeData = _T("Bla");
mii.wID = uID++;

if (!InsertMenuItem(hmenu, uMenuIndex, TRUE, &mii))
{
return HRESULT_FROM_WIN32(GetLastError());
}

if (!InsertMenu(hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL))
{
return HRESULT_FROM_WIN32(GetLastError());
}

return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, uID - uidFirstCmd);
}

РЕДАКТИРОВАТЬ:
Я попробовал другой метод, не используя подменю, и все равно не повезло, все, что я получаю, это «Меню 1», а «Меню 2» отсутствует …

введите описание изображения здесь

STDMETHODIMP CFileFavShellExt::QueryContextMenu (HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd, UINT uidLastCmd, UINT uFlags )
{
// This is not our business.
if (CMF_DEFAULTONLY & uFlags)
{
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
}

UINT uID = uidFirstCmd;
UINT pos = uMenuIndex;

MENUITEMINFO mii = { sizeof(mii) };
mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_ID | MIIM_STATE;
mii.fType = MFT_STRING;
mii.dwTypeData = _T("Menu 1");
mii.fState = MFS_ENABLED;
mii.wID = uID++;

if (!InsertMenuItem(hmenu, pos++, TRUE, &mii))
{
return HRESULT_FROM_WIN32(GetLastError());
}

MENUITEMINFO mii2 = { sizeof(mii) };
mii2.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_ID | MIIM_STATE;
mii2.fType = MFT_STRING;
mii2.dwTypeData = _T("Menu 2");
mii2.fState = MFS_ENABLED;
mii2.wID = uID++;

if (!InsertMenuItem(hmenu, pos++, TRUE, &mii2))
{
return HRESULT_FROM_WIN32(GetLastError());
}

return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, uID - uidFirstCmd);
}

0

Решение

Подменю есть, потому что вы добавляете его.

MENUITEMINFO mii = { sizeof(mii) };
mii.fMask = MIIM_SUBMENU | MIIM_ID | MIIM_STRING;
mii.hSubMenu = hSubmenu;
mii.fType = MFT_STRING;
mii.dwTypeData = _T("Bla");
mii.wID = uID++;

if (!InsertMenuItem(hmenu, uMenuIndex, TRUE, &mii))
{
return HRESULT_FROM_WIN32(GetLastError());
}

Это добавляет подменю «Bla», в которое вы добавили другие свои предметы. Чтобы исключить подменю, просто удалите этот код и добавьте остальные свои пункты непосредственно в главное меню.

2

Другие решения

хотя этот вопрос был опубликован давно, может быть, я нашел проблему. Я потратил около двух дней на ту же проблему. Моя проблема была в том, что в GetCommandString Функция Я вернул одну и ту же строку для всех моих команд, так что я считаю, что менеджер оболочки принимает все команды как одинаковые и добавляет только одну команду. решение было вернуть разные строки для разных команд, например

IFACEMETHODIMP CLASSNAME::GetCommandString(UINT_PTR command_id, UINT flags, UINT * reserved, LPSTR name, UINT size)
{

HRESULT hr = S_FALSE;
if( command_id == 1)
hr = StringCchCopy(reinterpret_cast<PWSTR>(name), size,
L"some help text");
if(command_id ==0)
hr = StringCchCopy(reinterpret_cast<PWSTR>(name), size,
L"some other help text");
return hr;}
1

По вопросам рекламы [email protected]