エクスプローラの「元に戻す」を実現するには


まこと  2012-08-20 06:01:44  No: 42795

いつもお世話になっています。1点質問させてください。
  現在、ファイラーを作成しています。その中で、エクスプローラにも実装
されている「元に戻す」機能をつけたいと考えています。
  ファイラーでのファイル削除等の機能は、SHFileOperationで実装して
いるため、エクスプローラの右クリックメニューからなら「元に戻す」が可能
ですが、自作のファイラーからは元に戻すことができません。

エクスプローラーでは、

・元に戻せるかどうかの判別
・元に戻せる場合は、それが削除なのかファイル名変更なのか、といった
  判別

まで可能となっているようですが、これを実際に実現された方はいらっしゃい
ますでしょうか。もし実現された方がおられましたら、資料の置き場所だけ
でも結構ですので、情報提供をお願いできないでしょうか。

私はファイラーのエンジン部分にMustangPeakのVirtualShellToolsを使用
させていただいておりますが、これを用いた有名なファイラー
(CubicExplorerやUltraExploere)でも、「元に戻す」を実装できてはいない
ようでした。また、Googleで各種ホームページも当たりましたが、このあたり
についてはうまく情報を入手できておりません。


Terry  2012-08-20 06:58:32  No: 42796

こことか
https://www.petitmonte.com/bbs/answers?question_id=1597
こことか
http://www.asahi-net.or.jp/~gv4j-sgur/narik/stp002b.htm
こことか
http://webcache.googleusercontent.com/search?q=cache:FNFGuc1l_lYJ:groups.google.co.jp/group/delphicbuilder-ml-archive/t/20351bdae27ca51c+
なんか私の名前もあるようですが今回はよく確認していません


まこと  2012-08-22 08:30:10  No: 42797

ご回答、どうもありがとうございます。
  まだ内容をよく理解していないのですが、ご提示いただいた内容は、
「ゴミ箱から戻す」であって、「エクスプローラの元に戻すと同じ動作を
させる」とは異なる内容のように見えるのですが…


Mr.XRAY  2012-08-22 09:06:31  No: 42798

こんにちは,Mr.XRAYです.

エクスプローラの「元に戻す」ですが,
おそらく,エクスプローラが独自で実装しているのではないかと思います.
例えば,自作のファイル操作で削除しても,エクスプローラはそれを検出してくれません.
自前で実装することになるのではないかと思われます.


まこと  2012-08-23 06:41:54  No: 42799

ご回答、どうもありがとうございます。
ただ、自前のプログラムでファイル削除やファイル名変更をしても、
エクスプローラの「元に戻す」はきちんと働きます。そのため、どこかに
共通の仕組みが用意されており、エクスプローラは単純にそれを利用して
いるだけなのではないかと考えていました。

念のため環境を書いておきますと、Windows7Pro(64bit)です。
Delphi6PersonalでVirtualShellToolsを利用しています。

ファイラはTVirtualExplorerEasyListviewを利用しており、そこで表示
されるファイルを右クリックして削除すると、エクスプローラでも
元に戻せます。


Terry  2012-08-23 08:24:15  No: 42800

コンテキストメニューを取得して云々の例として
あげたんですが…


AE85  2012-08-23 09:15:13  No: 42801

X-Finderの作者さんのメモですが
ttp://www.eonet.ne.jp/~gakana/memo/xfmemo1.html
あたりで出来そうかな?


Mr.XRAY  2012-08-23 09:49:35  No: 42802

>ただ、自前のプログラムでファイル削除やファイル名変更をしても、
>エクスプローラの「元に戻す」はきちんと働きます。そのため、どこかに

あらっ 1?
うそ書いてしまった.前に,Windows XPでテストした時にならなかった記憶が
あったもんですから.スミマセン.

>ttp://www.eonet.ne.jp/~gakana/memo/xfmemo1.html

これ詳しいてすね.

>CommandID_UNDO の値は 28700 です。

前と言っても,かなり前ですが,これ見つけられませんでした.
う〜ん,近日中にやってみます.
情報サンクスです.
探せばあるもんなんですね.調査不足でした.


Mr.XRAY  2012-08-24 02:59:03  No: 42803

コマンドの値,確認しました.確かに

$701B =  28700 - 1

でした.で,この値を IContextMenu2 の InvokeCommand で実行してみしたのですが,
機能しません.
提示の X-Finder の記事をよく読んだら,IShellView.CreateViewWindow の実行が必要なようです.
ということは,エクスプローラのファイルリスト部のインスタンス(オブジェクト?) に対して
コマンドを送るんですね.

う〜ん.パスさせて頂きます(苦笑)


Mr.XRAY  2012-08-24 10:27:53  No: 42804

えらい時刻ですが,目が冴えて... (^^;

どうせ,エクスプローラのオブジェクトを生成するのですから,
提示のサイトの記事の一番下にあるように,エクスプローラを起動したった同じでしょう ?
というわけで,以下のコードでテストしてみました.

[元に戻す]が可能かどうかは,どうするんでしょうね.

//=============================================================================
//  [元に戻す]のテストコード
//  エクスプローラを非表示で起動して,そのハンドルにコマンドを送信
//
//  動作確認は,Windows XP(SP3) + Delphi XE
//  エクスプローラで,削除,コピー,移動をして元に戻ることを確認
//  ただし,テストに使用したファイルは,ローカルのPCで1つだけ
//
//  IWebBrowser2の使用には,usesにSHDocVwが必要
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
  AURL     : String;
  Flags    : OleVariant;
  IEObj    : IWebBrowser2;
  IEHandle : HWND;
begin
  //表示するのはこのプロジェクトのフォルダ内
  AURL := ExtractFileDir(ParamStr(0));

  //エクスプローラのオブジェクトを生成
  IEObj := CreateComObject(CLASS_ShellBrowserWindow) as IWebBrowser2;

  //フォルダがないとエラーになるのでその対策
  if DirectoryExists(AURL) then begin
    //指定のフォルダを新規にエクスプローラで表示
    Flags := 0;
    IEObj.Navigate(AURL,         //表示するフォルダ
                   Flags,        //各種設定フラグ
                   EmptyParam,   //表示フレームの指定
                   EmptyParam,   //サーバに送信するデータ
                   EmptyParam);  //サーバに送信するHTTPヘッダ

    //起動完了まで待つ
    while IEObj.ReadyState < READYSTATE_INTERACTIVE do begin
      Application.ProcessMessages;
    end;

    //開いたIEの操作用にIEのハンドル値を取得
    IEHandle := IEObj.HWnd;
    //元に戻す
    SendMessage(IEHandle, WM_COMMAND,  28700 - 1, 0);
  end;

  //起動したIEを閉じる
  PostMessage(IEHandle, WM_CLOSE, 0, 0);
  IEObj := nil;
end;


Mr.XRAY  2012-08-24 10:35:55  No: 42805

>ttp://www.eonet.ne.jp/~gakana/memo/xfmemo1.html

ここでの IShellBrowser での説明では,デスクトップの表示ですが,
どこでも同じです.


Mr.XRAY  2012-08-25 01:12:06  No: 42806

参考までに,
IShellBrowser を使用したエクスプローラの表示例です.
この画像は,表示したエクスプローラを,自アプリのフォームに表示してしまっていますが.(^^;

http://mrxray.on.coocan.jp/Delphi/plSamples/947_ExplorerBrowsert.htm#fig1


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

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






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