将文件复制到剪贴板
问题描述:
我想将二进制文件复制到剪贴板,因此当用户右键单击屏幕时可以看到粘贴选项启用。软件很好地处理粘贴部分,只需要将文件复制到剪贴板。 这是我第一次与剪贴板工作我想这个代码将文件复制到剪贴板
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
:
对于你正在尝试做的,你将需要:
-
的
TStream
数据保存到临时文件,然后使用CF_HDROP
将该文件名放在剪贴板上。使用CFSTR_FILEDESCRIPTOR
和CFSTR_FILECONTENTS
而不是CF_HDROP
。然后,您可以为您的数据提供一个IStream
(请参阅RTL的TStreamAdapter
课程,以在IStream
实施内包装TStream
)。但是,您无法通过SetClipboardData()
来执行此操作,因此您需要实现IDataObject
接口,并将其与OleSetClipboard()
一起使用。有关详细信息,请参阅MSDN: 使用
RegisterClipboardFormat()
注册自定义的剪贴板格式,那么你可以存储任何你想要在剪贴板上,包括整个文件(这是不可取的尽管)将大量的数据放在剪贴板上)。但是,在调用GetClipboardData()
来访问您的自定义数据时,另一个粘贴数据的应用程序也必须使用RegisterClipboardFormat()
。
无论哪种方式,已显示的代码是唯一适合作为-为#3。
非常感谢你,帮助我很多,因为我现在没有关于剪贴板的想法,现在我知道它是如何工作的,所以我会检查应用程序,看看它是如何处理粘贴数据,然后我可以决定哪个我要将文件复制到剪贴板 –