タイトルの通りですが、複数のドライブにまたがる
複数のファイルのコンテキストメニューを得る方法がわかりません。
考えられるコードは書いたつもりなのですが、
どれも正解とは言えないメニューが表示されます。
理想としては、エクスプローラの検索ウィンドウの感じです。
検索されたファイルが複数ドライブに渡っており、
それらを全て選択した状態で右クリックした時のメニューが出したいです。
以下コード(一部)です。
// --- 通常(同ディレクトリの複数もしくは単数ファイル) ---
filename: WideString;
fileidls: array of PItemIDList;
dir: WideString;
diridl: PItemIDList;
dirsf: TShellFolder;
desktop: IShellFolder;
ctm: IContextMenu;
if FAILED(desktop.ParseDisplayName(0,nil,PWideChar(Directory),eaten,diridl,attr)) then
Exit;
if FAILED(desktop.BindToObject(diridl,nil,IID_IShellFolder,Pointer(dirsf))) then
Exit;
for cnt := 0 to Files.Count - 1 do
begin
filename := FFiles[i];
if FAILED(dirsf.ParseDisplayName(0,nil,PWideChar(filename),eaten,fileidls[i],attr)) then
Exit;
end;
if FAILED(dirsf.GetUIObjectOf(0,Length(fileidls),fileidls[0],IID_IContextMenu,nil,Pointer(ctm))) then
Exit;
↑最後のコンテキストメニューはファイルの存在するディレクトリにもらってます。
複数のドライブにまたがる場合、相対パスでも表現できないので、ItemIDListの取得すらままならない状況です。
こちらで試したコードは
1.デスクトップから、絶対パス指定でのIDList取得の後、デスクトップからコンテキストメニューの取得
2.デスクトップからマイコンピュータのIDListを取得、それをバインドし、マイコンピュータのIShellFolderを取得
そこから絶対パスを指定し、IDListを取得、同じくマイコンピュータからコンテキストメニューを取得
3.複数ファイルのうちの最初のファイルの親ディレクトリからIDListを取得(当然同ディレクトリでないものは失敗)
4.デスクトップから無名ディレクトリとしてIDListを取得、それをバインドし、IShellFolderを取得、
そこから絶対パスにてIDListを取得し、同じくコンテキストメニューを取得(実質2と同じ)
以上全て思った結果にはなりませんでした。
どなたかお教えくださると大変助かります。
よろしくお願いします。
IEのコンテキストメニューはAPI一発で呼び出せるようなものではないので
IE自体もゴリゴリプログラムを書いてるはずです。
複数ファイルの場合は、とりあえず個々のメニューを取得して、すべてに重複してるものだけを表示するでいいのでは?
ツイート | ![]() |