ファイルをクリップボードにコピーするには?

解決


えらん  2005-05-03 22:23:48  No: 14604

delphiで作ったソフトとエクスプローラーの間でクリップボードを使ってファイルをコピー、貼り付け、切り取りをしたいのですが
どのようにすればファイルをクリップボードに貼り付けたり、コピーできるのかインターネットで探してもよくわかりません
もし知っている方がおられましたらご教授ください


  2005-05-04 01:19:27  No: 14605

http://homepage3.nifty.com/m-and-i/tips/tipspage.htm
CP(2,972byte)


えらん  2005-05-04 02:57:04  No: 14606

このコンポーネントも試しましたが貼り付けと切り取りがうまくいきませんでした


1  2005-05-04 05:10:58  No: 14607

何でもいいからファイル切り取りして、クリップボードを開いて
クリップボード保存して。メモ帳で開いて、
中のデータ覗いて  検索にかける

http://www.google.co.jp/search?hl=ja&q=Preferred+DropEffect+Shell+Object+Offsets+Shell+IDList+Array++&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

ほら  いっぱいでてきた。  

http://netez.com/2xExplorer/shellFAQ/adv_drag.html#shclip

ちょっとDelphiで遊んできます。  ■Юヘ(^_^)  バタン


えらん  2005-05-04 05:23:47  No: 14608

すいません  英語のページで何が書いてあるのかわかりません

できれば  delphiのコードで書かれた例など  ないでしょうか?
お手数かけますm(_ _)m


  2005-05-04 07:29:57  No: 14609

一個翻訳完了?・・・  英語でなくC→Delphiだけど
いっちょあがり。
とりあえずクリップボートからデータとるだけだけど

あとでみて
どこのユニットにあるのかわかりやすいように。
ユニット.型
ユニット.関数
で定義しています。

uses Clipbrd,ActiveX,ShellAPI;

procedure TForm1.Button1Click(Sender: TObject);
  var
    DataObject  : ActiveX.IDataObject;  // LPDATAOBJECT
    FormatEtcIn : ActiveX.TFormatEtc;   // FORMATETC
    medium      : ActiveX.tagSTGMEDIUM;    // STGMEDIUM
    nFiles , i : Integer;
    Buf : array[0..MAX_PATH+500] of Char;
    FileListsText : String;
    V : Variant;
begin
  FileListsText := '';
    if Clipboard.HasFormat(CF_HDROP) then
    begin
      FormatEtcIn.cfFormat  := CF_HDROP;
      FormatEtcIn.ptd      := nil;
      FormatEtcIn.dwAspect := DVASPECT_CONTENT;
      FormatEtcIn.lindex   := -1;
      FormatEtcIn.tymed    := TYMED_HGLOBAL;

      if ActiveX.OleGetClipboard(DataObject) = 0 then
      try
        V := DataObject.GetData(FormatEtcIn , medium);
          if Not VarIsClear(V) then
          begin
            nFiles := ShellAPI.DragQueryFile(medium.hGlobal
                              , $FFFFFFFF, nil, 0);
            for i := 0 to nFiles-1 do
            begin
              DragQueryFile(medium.hGlobal , i, Buf, SizeOf(Buf)-1);
             if (i=0) then
                FileListsText := Buf
               else
                FileListsText := FileListsText + #13#10+ Buf;
            end;
          end;
       finally
           DataObject._Release;
        end;
    end;

  Memo1.Text := FileListsText;
end;

コピー、カット、情報がどこにあるのかまだわからないので
探し中。


1  2005-05-04 08:21:03  No: 14610

米MSDN
OleGetClipboard
http://msdn.microsoft.com/library/en-us/com/html/c5e7badb-339b-48d5-8c9a-3950e2ffe6bf.asp

OleSetClipboard
http://msdn.microsoft.com/library/en-us/com/html/741def10-d2b5-4395-8049-1eba2e29b0e8.asp

日MSDNには情報ないようなので
このへんで訳すといいです
http://www.excite.co.jp/world/english/web/

DelphiについているPlatform SDKヘルプ(英語だけど)にも乗っています

遊び疲れて、あきたので  撤退します
では、ほかのかた  ヨロピコ(;_;)/~~~


1  2005-05-04 09:20:25  No: 14611

ここもやくにたちます
http://sapporo.cool.ne.jp/tanomi/qanda/a056.html


  2005-05-04 09:21:36  No: 14612

ここにもあった
http://sapporo.cool.ne.jp/tanomi/qanda/a055.html


  2005-05-04 09:54:50  No: 14613

こちらをどうぞ。

貼り付けのほうは  自分で
http://sapporo.cool.ne.jp/tanomi/qanda/a056.html
を  解読してください

http://sapporo.cool.ne.jp/tanomi/qanda/a055.html
は  ↓みたいな感じです。

procedure TForm1.Button2Click(Sender: TObject);
  var
    MyHandle : THandle;
    hDrop : Pointer;
    nFiles , i : Integer;
    Buf : array[0..MAX_PATH+500] of Char;
    FileListsText : String;
    dwEffect : Word;
    CF_DROPEFFECT : UINT;
begin
  if Clipboard.HasFormat(CF_HDROP) then
  begin
    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;
     finally
       if  MyHandle <>0 then GlobalUnlock(MyHandle);
     end;
   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;
   
   if (dwEffect and DROPEFFECT_COPY)>0 then
   begin
     //コピー
      Memo1.Lines.Add('コピー');
   end;
   if (dwEffect and DROPEFFECT_MOVE)>0  then
   begin
     //切り取り
      Memo1.Lines.Add('切り取り');
   end;
   if (dwEffect and DROPEFFECT_LINK)>0 then
   begin
     //ショートカット
      Memo1.Lines.Add('ショートカット');
   end;

    Memo1.Lines.Add(FileListsText);
end;


  2005-05-04 22:53:36  No: 14614

おはよぉーーー♪

完成♪

ちょっと使ってミソ

// ****************************************************
//   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.


1  2005-05-04 22:55:51  No: 14615

使い方

procedure TForm1.Button3Click(Sender: TObject);
begin
  FilesToClipboard(Handle,Memo1.Lines.Text,DROPEFFECT_COPY)
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
    dwEffect : Word;
begin
  Memo1.Text := ClipboardFromFiles(dwEffect);

  Memo2.Clear;
  if (dwEffect and DROPEFFECT_COPY)>0 then
   begin
     //コピー
      Memo2.Lines.Add('コピー');
   end;
   if (dwEffect and DROPEFFECT_MOVE)>0  then
   begin
     //切り取り
      Memo2.Lines.Add('切り取り');
   end;
   if (dwEffect and DROPEFFECT_LINK)>0 then
   begin
     //ショートカット
      Memo2.Lines.Add('ショートカット');
   end;
end;


えらん  2005-05-05 00:51:49  No: 14616

1さん、ソースつきでわかりやすい解説ありがとうございました。
1さんのソースと教えてくれたサイトのおかげで解決しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加