Delphi剪贴板:读取复制文件的文件属性

6
我希望能够获取复制到剪贴板中的文件大小。
我阅读了TClipboard的文档,但没有找到解决方案。
我发现TClipboard.GetAsHandle可能有所帮助,但我无法完成任务。

你可以阅读这些文章:文章1文章2。在你的情况下,VCL中关于 TClipboard 的文档并不是很有用。 - Josef Švejk
谢谢您的评论。您能否给我一个示例,说明如何匹配MS文档和VCL文档? - UnDiUdin
1个回答

12

仅仅从检查剪贴板,我就能看到至少2种有用的格式:

FileName (Ansi) 和 FileNameW (Unicode),它们保存了复制到剪贴板中的文件名。因此你可以使用RegisterClipboardFormat注册其中一个(或两个),然后获取你需要的信息。例如:

uses Clipbrd;

var
  CF_FILE: UINT;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CF_FILE := RegisterClipboardFormat('FileName');
end;

function ClipboardGetAsFile: string;
var
  Data: THandle;
begin
  Clipboard.Open;
  Data := GetClipboardData(CF_FILE);
  try
    if Data <> 0 then
      Result := PChar(GlobalLock(Data)) else
      Result := '';
  finally
    if Data <> 0 then GlobalUnlock(Data);
    Clipboard.Close;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Clipboard.HasFormat(CF_FILE) then
    ShowMessage(ClipboardGetAsFile);
end;

获取文件名后,可以获取其大小或其他想要的属性。
注意:以上内容已在 Delphi 7 中进行测试。对于 Unicode 版本的 Delphi,请使用 FileNameW 格式。

另一种更实用的方法(也适用于复制多个文件)是注册并处理CF_HDROP格式。

以下是 Delphi 的示例:如何从 Windows 资源管理器中粘贴文件到您的应用程序


感谢提供示例,我已经尝试了,但是如果我在剪贴板中有一个文件,我会得到[Content]。 - UnDiUdin
我尝试注册FileNameW,它给了我复制文件的正确路径。 - UnDiUdin
3
由于您使用的是Unicode Delphi版本,而我在Delphi 7(Ansi,非Unicode)中进行测试,因此要使用FileName格式,您需要将PChar替换为PAnsiChar,并将string替换为AnsiString。无论如何,在Unicode版本/环境中使用FileNameW更有意义。总之,我个人认为应该选择CF_HDROP,因为它还可以处理多个文件,并且您不能假设用户只复制了一个文件。(在这种情况下,FileNameW格式将返回列表中的第一个文件)。 - kobik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接