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 |