0

Windows シェルのコンテキスト メニューに複数のメニュー項目を追加しようとしています。これまでに行ったのは次のコードです。これにより、アイテムをサブメニューとして追加し、メインのコンテキストメニューに表示させます。ここに写真があります: 私が持っているもの 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

この質問はずっと前に投稿されましたが、問題を見つけたのかもしれません。同じ問題で約2日無駄になりました。私の問題は、GetCommandString関数内ですべてのコマンドに対して同じ文字列を返したため、シェルマネージャーはすべてのコマンドを同じと見なし、コマンドを1つだけ追加していたことです。解決策は、たとえば、コマンドごとに異なる文字列を返すことでした

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 に答える
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 に答える