| history | TOP |
2005/03/05:作成
| overview | TOP |
少し前に見つけたサイトで、既に閉鎖されているんですが、いつかどこかで役に立ちそうなコードが記述されているところがあります。オリジナルは 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)
| EOF | TOP |