掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ファイルをクリップボードにコピーするには? (ID:14614)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
おはよぉーーー♪ 完成♪ ちょっと使ってミソ // **************************************************** // Exploror_ClipbrdDrops // // エクスプローラーの貼り付け、切り取り は // クリップボードとやりとりしているので、 // そこからデータをもらってくる関数です。 // ファイルの名前と動作を取得します。 // 移動などの操作は、別に記述する必要があります。 // **************************************************** unit Exploror_ClipbrdDrops; interface uses Windows , Classes ,SysUtils ,ShlObj,Clipbrd ,ShellAPI; function ClipboardFromFiles(var AFlag:Word) : string; // 使用例: // S := ClipboardFromFiles(AFlag); // if (AFlag and DROPEFFECT_COPY)>0 then ... function FilesToClipboard( Handle:HWND; AFiles : string; Flag:Word) : boolean; // 使用例: // ClipboardFromFiles(Handle,'C:\WINDOWS\シャボン.bmp', DROPEFFECT_LINK); // ClipboardFromFiles(Handle, Memo1.Text , DROPEFFECT_COPY); // ClipboardFromFiles(Handle, Memo1.Text , DROPEFFECT_COPY or DROPEFFECT_LINK); { AFlag 複数の場合は or でつなげる。 DROPEFFECT_COPY DROPEFFECT_MOVE DROPEFFECT_LINK } implementation function ClipboardFromFiles(var AFlag:Word) : string; var MyHandle : THandle; hDrop : Pointer; nFiles , i : Integer; Buf : array[0..MAX_PATH+500] of Char; FileListsText : String; dwEffect : Word; CF_DROPEFFECT : UINT; begin Result := ''; AFlag := 0; if Not (Clipboard.HasFormat(CF_HDROP)) then Exit; MyHandle := Clipboard.GetAsHandle(CF_HDROP); if MyHandle <> 0 then hDrop := Windows.GlobalLock(MyHandle); if hDrop <> nil then try nFiles := DragQueryFile(Integer(hDrop) , $FFFFFFFF, nil, 0); for i := 0 to nFiles-1 do begin DragQueryFile(Integer(hDrop) , i, Buf, SizeOf(Buf)-1); if (i=0) then FileListsText := Buf else FileListsText := FileListsText + #13#10+ Buf; end; Result := FileListsText; finally if MyHandle <>0 then GlobalUnlock(MyHandle); end; CF_DROPEFFECT := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT); if Clipboard.HasFormat(CF_DROPEFFECT) then begin MyHandle := Clipboard.GetAsHandle(CF_DROPEFFECT); if MyHandle <>0 then begin hDrop := Windows.GlobalLock(MyHandle); try dwEffect := PWord(hDrop)^; finally if MyHandle <>0 then GlobalUnlock(MyHandle); end; end; end; AFlag := dwEffect; end; function FilesToClipboard( Handle:HWND; AFiles : string; Flag:Word) : boolean; var StrList : TStringList; i , TotalBufSize : integer; Word_Pointer : PWord; dfs : DROPFILES; hDrop : HGLOBAL; pDrop : PChar; hDropEffect : HGLOBAL; CF_DROPEFFECT : UINT; MemError : Boolean; begin Result := False; MemError := False; //CF_HDROPを作成 FillChar(dfs,sizeof(DROPFILES),#0); StrList := TStringList.Create; if (Length(AFiles)>0) then try // ここから下は 1 個以上でないと中に入れない♪ StrList.Text := AFiles; dfs.pFiles := sizeof(dfs); // PChar (* Char) なので、最後のnullも足す // 総テキスト バッファのサイズ計算。 for i:= 0 to StrList.Count-1 do if i=0 then TotalBufSize := Length(StrList.Strings[i])+1 else Inc(TotalBufSize, Length(StrList.Strings[i])+1); Inc(TotalBufSize); // 文字列ポインタの最後のnull用 ** Char // メモリを確保 hDrop := GlobalAlloc(GHND, sizeof(DROPFILES) + TotalBufSize); // GHND = GMEM_MOVEABLE or MEM_ZEROINIT // nullで初期化指定なので、ポンポン放り込むだけ♪ pDrop := GlobalLock(hDrop); if (hDrop<>0) then try try // メモリを丸ごとコピー System.Move(dfs , pDrop^ , sizeof(DROPFILES)); // 文字列配列ポインタの最初へ移動 pDrop := Ptr(Integer(pDrop) + sizeof(DROPFILES)); for i := 0 to StrList.Count-1 do begin StrCopy(pDrop , PChar(StrList.Strings[i])); // ポインタを次の文字列の先頭に移す pDrop := Ptr(Integer(pDrop)+(Length(StrList.Strings[i])+1)); end; except MemError := True; end; finally GlobalUnlock(hDrop); end; //Preferred DropEffectを作成 try hDropEffect := GlobalAlloc(GHND, sizeof(DWORD)); Word_Pointer := GlobalLock(hDropEffect); Word_Pointer^ := Flag; GlobalUnlock(hDropEffect); except MemError := True; end; //クリップボードにデーターをセット if Not(MemError) then CF_DROPEFFECT := RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT); if Not(MemError) then if Not(OpenClipboard(Handle)) then begin // ロックされていてクリップボードが使えないので // 操作の取り消し MemError := True; end else try EmptyClipboard(); MemError := False; // 必要ないけど念のため SetClipboardData(CF_HDROP, hDrop); SetClipboardData(CF_DROPEFFECT, hDropEffect); Result := True; finally CloseClipboard(); end; if MemError then begin // メモリ操作で違反を起こしたので解放して終了 if hDrop>0 then GlobalFree(hDrop); if hDropEffect>0 then GlobalFree(hDropEffect); end finally StrList.Free; end; end; end.
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.