我想将二进制文件复制到剪贴板中,因此当用户右键单击屏幕时,可以看到粘贴选项启用。软件正在很好地处理粘贴部分,我需要将文件复制到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,但无法找到任何有用的示例。感谢
答案 0 :(得分:6)
CF_HDROP
格式无法保存实际文件数据,只能保存文件名。有关CF_HDROP
的详细信息,请参阅MSDN的文档:
对于您尝试做的事情,您需要:
将TStream
数据保存到临时文件,然后使用CF_HDROP
将该文件名放在剪贴板上。
使用CFSTR_FILEDESCRIPTOR
和CFSTR_FILECONTENTS
代替CF_HDROP
。然后,您可以为数据提供IStream
(查看RTL&#39; TStreamAdapter
类,以便在TStream
实现中包装IStream
。但是,您无法使用SetClipboardData()
执行此操作,您需要实现IDataObject
界面并将其与OleSetClipboard()
一起使用。有关详细信息,请参阅MSDN:
使用RegisterClipboardFormat()
注册自定义剪贴板格式,然后您可以在剪贴板上存储任何内容,包括整个文件(不建议将大量数据放在剪贴板上) 。但是,在调用GetClipboardData()
访问您的自定义数据时,粘贴数据的其他应用也必须使用RegisterClipboardFormat()
。
无论哪种方式,您显示的代码仅适用于#3。