0

Windows APIを使用してシェルのコンテキストメニュー項目を列挙するにはどうすればよいですか?私は純粋なCでそれをする必要があります。

4

3 に答える 3

1

Explorerが行うことを正確に行う必要があります。問題のアイテム(ファイル、フォルダー、その他のシェル名前空間の場所)について、シェル拡張のリストを識別します。これらはCOMクラスであり、IContextMenuインターフェースを実装します。適用可能なすべてのシェル拡張機能について、独自のメニューを提供し、そのような拡張機能(ハンドラー)がメニューに追加項目(IContextMenu::QueryContextMenu)を追加するように要求できます。

後で、このメニューをいつ、どこで、どのようにポップアップするかを自由に決めることができます。これらの追加のハンドラーのコマンドの1つを処理する必要がある場合は、を介してコマンドをハンドラーに転送する必要がありますIContextMenu::InvokeCommand。何らかの理由で特定のコマンドを自動化し、メニューをポップアップせずに呼び出すことを好む場合は、それを行うこともできます。

あなたが興味を持っているかもしれないリンク:

于 2012-07-05T15:15:36.340 に答える
1

メニューを表示したいのか、単に項目を列挙したいのかは少しわかりませんが、後者を実行します(サブメニューを除く)

HRESULT GetContextMenuForFSItem(PCTSTR path,IContextMenu**ppCM)
{
    PIDLIST_ABSOLUTE pidlAbs;
    HRESULT hr = SHParseDisplayName(path,0,&pidlAbs,0,0);
    if (!hr)
    {
        IShellFolder*pSF;
        PCUITEMID_CHILD pidlLast;
        hr = SHBindToParent(pidlAbs,&IID_IShellFolder,(void**)&pSF,&pidlLast);
        if (!hr)
        {
            hr = pSF->lpVtbl->GetUIObjectOf(pSF,0,1,&pidlLast,&IID_IContextMenu,0,(void**)ppCM);
            pSF->lpVtbl->Release(pSF);
        }
        ILFree(pidlAbs);
    }
    return hr;
}

int main()
{
    CoInitialize(0);
    WCHAR buf[MAX_PATH];
    GetWindowsDirectory(buf,MAX_PATH); /* Arbitrary filesystem item */
    IContextMenu*pCM;
    HRESULT hr = GetContextMenuForFSItem(buf,&pCM);
    if (!hr) 
    {
        HMENU hMenu = CreatePopupMenu();
        hr = pCM->lpVtbl->QueryContextMenu(pCM,hMenu,0,1,0x7fff,0);
        if (hr > 0)
        {
            UINT c=GetMenuItemCount(hMenu), i=0;
            for (; i<c; ++i)
            {
                GetMenuString(hMenu,i,buf,MAX_PATH,MF_BYPOSITION);
                if (GetMenuState(hMenu,i,MF_BYPOSITION)&MF_SEPARATOR) lstrcpy(buf,_T("--separator--"));
                printf("%.2u=%ws\n",i,buf);
                /*
                Call IContextMenu::GetCommandString  to get the verb 
                or IContextMenu::InvokeCommand to execute
                */
            }
        }
        pCM->lpVtbl->Release(pCM);
        DestroyMenu(hMenu);
    }
    CoUninitialize();
    return 0;
}

私のシステムでは、これは次のように出力します。

00=&Open
01=--separator--
02=S&hare with
03=Restore previous &versions
04=&Include in library
05=--separator--
06=Se&nd to
07=--separator--
08=Cu&t
09=&Copy
10=--separator--
11=Create &shortcut
12=&Delete
13=--separator--
14=P&roperties

CでCOMを使用するのは楽しいことではありません。可能であれば、C++に切り替えてください...

于 2012-07-05T20:18:24.463 に答える
0

Raymond Chenは、これを行う方法を説明する11部のシリーズを作成しました。それは本当に簡単ではありません。

于 2012-07-05T15:08:44.960 に答える