0

我正在尝试将多个菜单项添加到 windows shell 的上下文菜单中。到目前为止,我所做的是以下代码,这将我的项目添加为子菜单,而我希望它们位于主上下文菜单上。这是一张照片: 我所拥有的 vs 我想要的

有任何想法吗?谢谢!

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);
}
4

2 回答 2

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());
}

这将添加您已添加其他项目的“Bla”子菜单。要消除子菜单,只需消除此代码,然后将其他项目直接添加到主菜单。

于 2013-06-17T23:31:52.863 回答
2

虽然这个问题是很久以前发布的,但也许我发现了问题。我浪费了大约两天的时间来解决同样的问题。我的问题是在GetCommandString函数中我为所有命令返回了相同的字符串,所以我的东西 shell 管理器假定所有命令都相同并且只添加一个命令。解决方案是为不同的命令返回不同的字符串,例如

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;}
于 2016-08-19T13:49:03.637 回答