Windows APIを使用してシェルのコンテキストメニュー項目を列挙するにはどうすればよいですか?私は純粋なCでそれをする必要があります。
3 に答える
Explorerが行うことを正確に行う必要があります。問題のアイテム(ファイル、フォルダー、その他のシェル名前空間の場所)について、シェル拡張のリストを識別します。これらはCOMクラスであり、IContextMenu
インターフェースを実装します。適用可能なすべてのシェル拡張機能について、独自のメニューを提供し、そのような拡張機能(ハンドラー)がメニューに追加項目(IContextMenu::QueryContextMenu
)を追加するように要求できます。
後で、このメニューをいつ、どこで、どのようにポップアップするかを自由に決めることができます。これらの追加のハンドラーのコマンドの1つを処理する必要がある場合は、を介してコマンドをハンドラーに転送する必要がありますIContextMenu::InvokeCommand
。何らかの理由で特定のコマンドを自動化し、メニューをポップアップせずに呼び出すことを好む場合は、それを行うこともできます。
あなたが興味を持っているかもしれないリンク:
メニューを表示したいのか、単に項目を列挙したいのかは少しわかりませんが、後者を実行します(サブメニューを除く)
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++に切り替えてください...
Raymond Chenは、これを行う方法を説明する11部のシリーズを作成しました。それは本当に簡単ではありません。