いつもお世話になっています。1点質問させてください。
現在、ファイラーを作成しています。その中で、エクスプローラにも実装
されている「元に戻す」機能をつけたいと考えています。
ファイラーでのファイル削除等の機能は、SHFileOperationで実装して
いるため、エクスプローラの右クリックメニューからなら「元に戻す」が可能
ですが、自作のファイラーからは元に戻すことができません。
エクスプローラーでは、
・元に戻せるかどうかの判別
・元に戻せる場合は、それが削除なのかファイル名変更なのか、といった
判別
まで可能となっているようですが、これを実際に実現された方はいらっしゃい
ますでしょうか。もし実現された方がおられましたら、資料の置き場所だけ
でも結構ですので、情報提供をお願いできないでしょうか。
私はファイラーのエンジン部分にMustangPeakのVirtualShellToolsを使用
させていただいておりますが、これを用いた有名なファイラー
(CubicExplorerやUltraExploere)でも、「元に戻す」を実装できてはいない
ようでした。また、Googleで各種ホームページも当たりましたが、このあたり
についてはうまく情報を入手できておりません。
こことか
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+
なんか私の名前もあるようですが今回はよく確認していません
ご回答、どうもありがとうございます。
まだ内容をよく理解していないのですが、ご提示いただいた内容は、
「ゴミ箱から戻す」であって、「エクスプローラの元に戻すと同じ動作を
させる」とは異なる内容のように見えるのですが…
こんにちは,Mr.XRAYです.
エクスプローラの「元に戻す」ですが,
おそらく,エクスプローラが独自で実装しているのではないかと思います.
例えば,自作のファイル操作で削除しても,エクスプローラはそれを検出してくれません.
自前で実装することになるのではないかと思われます.
ご回答、どうもありがとうございます。
ただ、自前のプログラムでファイル削除やファイル名変更をしても、
エクスプローラの「元に戻す」はきちんと働きます。そのため、どこかに
共通の仕組みが用意されており、エクスプローラは単純にそれを利用して
いるだけなのではないかと考えていました。
念のため環境を書いておきますと、Windows7Pro(64bit)です。
Delphi6PersonalでVirtualShellToolsを利用しています。
ファイラはTVirtualExplorerEasyListviewを利用しており、そこで表示
されるファイルを右クリックして削除すると、エクスプローラでも
元に戻せます。
コンテキストメニューを取得して云々の例として
あげたんですが…
X-Finderの作者さんのメモですが
ttp://www.eonet.ne.jp/~gakana/memo/xfmemo1.html
あたりで出来そうかな?
>ただ、自前のプログラムでファイル削除やファイル名変更をしても、
>エクスプローラの「元に戻す」はきちんと働きます。そのため、どこかに
あらっ 1?
うそ書いてしまった.前に,Windows XPでテストした時にならなかった記憶が
あったもんですから.スミマセン.
>ttp://www.eonet.ne.jp/~gakana/memo/xfmemo1.html
これ詳しいてすね.
>CommandID_UNDO の値は 28700 です。
前と言っても,かなり前ですが,これ見つけられませんでした.
う〜ん,近日中にやってみます.
情報サンクスです.
探せばあるもんなんですね.調査不足でした.
コマンドの値,確認しました.確かに
$701B = 28700 - 1
でした.で,この値を IContextMenu2 の InvokeCommand で実行してみしたのですが,
機能しません.
提示の X-Finder の記事をよく読んだら,IShellView.CreateViewWindow の実行が必要なようです.
ということは,エクスプローラのファイルリスト部のインスタンス(オブジェクト?) に対して
コマンドを送るんですね.
う〜ん.パスさせて頂きます(苦笑)
えらい時刻ですが,目が冴えて... (^^;
どうせ,エクスプローラのオブジェクトを生成するのですから,
提示のサイトの記事の一番下にあるように,エクスプローラを起動したった同じでしょう ?
というわけで,以下のコードでテストしてみました.
[元に戻す]が可能かどうかは,どうするんでしょうね.
//=============================================================================
// [元に戻す]のテストコード
// エクスプローラを非表示で起動して,そのハンドルにコマンドを送信
//
// 動作確認は,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;
>ttp://www.eonet.ne.jp/~gakana/memo/xfmemo1.html
ここでの IShellBrowser での説明では,デスクトップの表示ですが,
どこでも同じです.
参考までに,
IShellBrowser を使用したエクスプローラの表示例です.
この画像は,表示したエクスプローラを,自アプリのフォームに表示してしまっていますが.(^^;
http://mrxray.on.coocan.jp/Delphi/plSamples/947_ExplorerBrowsert.htm#fig1
ツイート | ![]() |