[BlueLeaf1336]> PROGRAM>

Explorerでコピーしたファイルパス取得

historyTOP

2005/03/05:作成

overviewTOP

少し前に見つけたサイトで、既に閉鎖されているんですが、いつかどこかで役に立ちそうなコードが記述されているところがあります。オリジナルは Visual Basic ですので、Delphiに翻訳したものを、勝手に掲載することにします。

閉鎖されているので、Welcome to The Internet Archive Wayback Machine で過去のスナップショットを覗き見ることになるんですが、次のリンクのうち、上2つはこの覗き見分となります。

ほぼそのまま翻訳TOP

uses
    ClipBrd, ShellApi;

//---------------------------------------------------------------------------
//  関数名: IsFileDropData
//  機  能: クリップボードのデータがファイルドロップ形式か判定する
//  引  数: hWnd … ウインドウハンドル
//  返り値: True:ファイルドロップ形式   False:そうではない
//  備  考: 特になし
//---------------------------------------------------------------------------
function IsFileDropData(const WH: HWND): Boolean;
const
    CF_HDROP = 15;
var
    ClipboardFormat: Cardinal;
begin
    Result := False;
    ClipboardFormat := 0;

    //  クリップボードを開く
    if OpenClipboard(WH) then
    begin
        try
            //  クリップボードに格納されているデータの形式を取得する
            repeat
                ClipboardFormat := EnumClipboardFormats(ClipboardFormat);
                if (ClipboardFormat = CF_HDROP) then
                begin
                    Result := True;
                    break;
                end;
            until
                (ClipboardFormat = 0)
            ;
        finally
            //  クリップボードを閉じる
            CloseClipboard();
        end;
    end;
end;

//---------------------------------------------------------------------------
//  関数名: GetFileDropData
//  機  能: ファイルドロップ形式データを取得する
//  引  数: hWnd   … メインウインドウのハンドル
//           FileList … ファイルドロップ形式データ
//  返り値: 正常:True  エラー:False
//  備  考: 一気に表示する
//---------------------------------------------------------------------------
function GetFileDropData(WH: HWND; FileList: TStrings): Boolean;
var
    ClipHandle: THandle;
    MemDrop: Pointer;
    i, Count: integer;
    FileName: Array[0..MAX_PATH] of Char;
begin
    Result := False;
    //  クリップボードを開く
    if (OpenClipboard(WH)) then
    begin
        try
            //  クリップボードデータ取得
            ClipHandle := GetClipboardData(CF_HDROP);

            //  成功
            if (ClipHandle <> 0) then
            begin
                //  メモリーオブジェクトをロックする
                MemDrop := GlobalLock(ClipHandle);

                //  成功
                if (MemDrop <> nil) then
                begin
                    try
                        //  クリップボードに格納されたファイル数を取得する
                        Count := DragQueryFile(Integer(MemDrop), DWORD(-1),
                                                FileName, SizeOf(FileName));
                        for i := 0 to Count - 1 do
                        begin
                            //  それぞれのファイル名を取得する
                            DragQueryFile(Integer(MemDrop), i,
                                            FileName, SizeOf(FileName));
                            //  リストに追加
                            FileList.Add(FileName);
                        end;
                        Result := True;
                    finally
                        //  ロック解放
                        GlobalUnlock(ClipHandle);
                    end;
                end;
            end;
        finally
            //  クリップボードを閉じる
            CloseClipboard();
        end;
    end;
end;

//---------------------------------------------------------------------------
//  呼び出しサンプル
//  エクスプローラで適当なファイルをコピーした後に実行すると
//  コピーしたファイルのフルパスが表示される。
//---------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
    //  クリップボードのファイルリスト判定
    if (IsFileDropData(Self.Handle)) then
    begin
        //  クリップボードよりファイルリストを取得する
        if (GetFileDropData(Self.Handle, Memo1.Lines)) then
        begin
            MessageBox(Self.Handle, PChar('成功'),
                        PChar(Application.Title),
                        MB_OK + MB_ICONINFORMATION);
        end;
    end;
end;

実行結果・ダウンロードTOP

エクスプローラでフォルダを開いて、適当にファイルをコピーします。

ファイルをコピーした状態で、ボタンをクリックすると、確かにコピーしたファイルのパスを取り出せています。すばらしい。

参考元のサイトでは、「自作テキストエディタなどに組み込むと大変便利!!」と説明されているんですが、用途不明です。ただ、何かにすごく使えそうな予感がします。

GetFilePathFromClipBoard.zip(166,649bytes)

EOFTOP