将文件复制到剪贴板

问题描述:

我想将二进制文件复制到剪贴板,因此当用户右键单击屏幕时可以看到粘贴选项启用。软件很好地处理粘贴部分,只需要将文件复制到剪贴板。 这是我第一次与剪贴板工作我想这个代码将文件复制到剪贴板

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; 

这是不工作的IM不知道,但我猜,因为即时通讯传递给方法

CopyStreamToClipboard(CF_HDROP, fileStream); 

我想把手的其也可以使用SetClipboardData,但找不到任何有用的示例。谢谢

CF_HDROP格式不能容纳实际的文件数据,只有文件名。阅读MSDN的更多细节文档中关于CF_HDROP

Shell Clipboard Formats

对于你正在尝试做的,你将需要:

  1. TStream数据保存到临时文件,然后使用CF_HDROP将该文件名放在剪贴板上。使用CFSTR_FILEDESCRIPTORCFSTR_FILECONTENTS而不是CF_HDROP。然后,您可以为您的数据提供一个IStream(请参阅RTL的TStreamAdapter课程,以在IStream实施内包装TStream)。但是,您无法通过SetClipboardData()来执行此操作,因此您需要实现IDataObject接口,并将其与OleSetClipboard()一起使用。有关详细信息,请参阅MSDN:

    Shell Data Object

    Handling Shell Data Transfer Scenarios

  2. 使用RegisterClipboardFormat()注册自定义的剪贴板格式,那么你可以存储任何你想要在剪贴板上,包括整个文件(这是不可取的尽管)将大量的数据放在剪贴板上)。但是,在调用GetClipboardData()来访问您的自定义数据时,另一个粘贴数据的应用程序也必须使用RegisterClipboardFormat()

无论哪种方式,已显示的代码是唯一适合作为-为#3。

+0

非常感谢你,帮助我很多,因为我现在没有关于剪贴板的想法,现在我知道它是如何工作的,所以我会检查应用程序,看看它是如何处理粘贴数据,然后我可以决定哪个我要将文件复制到剪贴板 –