将文件复制到剪贴板

时间:2017-06-12 21:48:06

标签: delphi clipboard filestream

我想将二进制文件复制到剪贴板中,因此当用户右键单击屏幕时,可以看到粘贴选项启用。软件正在很好地处理粘贴部分,我需要将文件复制到clpboard中。 这是我第一次使用剪贴板我试过这段代码

Procedure CopyStreamToClipboard( fmt: Cardinal; S: TStream );
  Var
    hMem: THandle;
    pMem: Pointer;
  Begin
    S.Position := 0;
    hMem := GlobalAlloc( GHND or GMEM_DDESHARE, S.Size );
    If hMem <> 0 Then Begin
      pMem := GlobalLock( hMem );
      If pMem <> Nil Then Begin
        try
          S.Read( pMem^, S.Size );
          S.Position := 0;
        finally
          GlobalUnlock( hMem );
        end;
        Clipboard.Open;
        try
          Clipboard.SetAsHandle( fmt, hMem );
        finally
          Clipboard.Close;
        end;
      End { If }
      Else Begin
        GlobalFree( hMem );
        OutOfMemoryError;
      End;
    End { If }
    Else
      OutOfMemoryError;
  End;

哪个不起作用我不确定,但我猜它是因为我传递给方法的句柄

CopyStreamToClipboard( CF_HDROP, fileStream );

我也想使用SetClipboardData,但无法找到任何有用的示例。感谢

1 个答案:

答案 0 :(得分:6)

CF_HDROP格式无法保存实际文件数据,只能保存文件名。有关CF_HDROP的详细信息,请参阅MSDN的文档:

Shell Clipboard Formats

对于您尝试做的事情,您需要:

  1. TStream数据保存到临时文件,然后使用CF_HDROP将该文件名放在剪贴板上。

  2. 使用CFSTR_FILEDESCRIPTORCFSTR_FILECONTENTS代替CF_HDROP。然后,您可以为数据提供IStream(查看RTL&#39; TStreamAdapter类,以便在TStream实现中包装IStream。但是,您无法使用SetClipboardData()执行此操作,您需要实现IDataObject界面并将其与OleSetClipboard()一起使用。有关详细信息,请参阅MSDN:

    Shell Data Object

    Handling Shell Data Transfer Scenarios

  3. 使用RegisterClipboardFormat()注册自定义剪贴板格式,然后您可以在剪贴板上存储任何内容,包括整个文件(不建议将大量数据放在剪贴板上) 。但是,在调用GetClipboardData()访问您的自定义数据时,粘贴数据的其他应用也必须使用RegisterClipboardFormat()

  4. 无论哪种方式,您显示的代码仅适用于#3。