複数のドライブに存在する複数のファイルのコンテキストメニューを得るためには


バトルジャパン  2009-07-22 04:47:54  No: 35198

タイトルの通りですが、複数のドライブにまたがる
複数のファイルのコンテキストメニューを得る方法がわかりません。

考えられるコードは書いたつもりなのですが、
どれも正解とは言えないメニューが表示されます。
理想としては、エクスプローラの検索ウィンドウの感じです。
検索されたファイルが複数ドライブに渡っており、
それらを全て選択した状態で右クリックした時のメニューが出したいです。

以下コード(一部)です。

// --- 通常(同ディレクトリの複数もしくは単数ファイル) ---

  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と同じ)

以上全て思った結果にはなりませんでした。
どなたかお教えくださると大変助かります。
よろしくお願いします。


monaa  2009-07-23 05:47:53  No: 35199

IEのコンテキストメニューはAPI一発で呼び出せるようなものではないので
IE自体もゴリゴリプログラムを書いてるはずです。
複数ファイルの場合は、とりあえず個々のメニューを取得して、すべてに重複してるものだけを表示するでいいのでは?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加