【问题标题】:Howto add multiple menu items to windows shell extension?如何将多个菜单项添加到 Windows shell 扩展?
【发布时间】:2023-04-01 04:47:01
【问题描述】:

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

有什么想法吗?谢谢!

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

【问题讨论】:

    标签: c++ winapi contextmenu windows-shell


    【解决方案1】:

    子菜单在那里,因为您正在添加它。

    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”子菜单。要消除子菜单,只需消除此代码,然后将其他项目直接添加到主菜单。

    【讨论】:

    • 这就是我最初所做的,但它不起作用:它只显示第一个菜单项而没有第二个。 InsertMenu(hMenu, indexMenu, MF_BYPOSITION, idCmdFirst + addedCount, _T("menu1")); InsertMenu(hMenu, indexMenu+1, MF_BYPOSITION, idCmdFirst+1, _T("menu 2"));
    【解决方案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;}
    

    【讨论】:

    • 谢谢,我只浪费了 3 个小时才找到这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多