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

LaB*_*cca 7 delphi clipboard filesize delphi-10-seattle

我想检索复制到剪贴板的文件的文件大小。

我阅读了TClipboard文档,但没有找到解决方案。

我认为这TClipboard.GetAsHandle可能会有所帮助,但是我无法完成任务。

谢谢。

kob*_*bik 11

仅从检查剪贴板就可以看到至少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;
Run Code Online (Sandbox Code Playgroud)

获得文件名后,只需获取文件的大小或所需的其他属性即可。
注意:以上内容已在Delphi 7中进行了测试。Delphi的Unicode版本使用该FileNameW格式。

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

这是Delphi中的一个示例:如何将文件从Windows资源管理器粘贴到应用程序中

  • @LaBracca,那是因为您具有Unicode Delphi版本,并且我在Delphi 7(Ansi,非Unicode)中进行了测试。因此,为了使用`FileName`格式,您需要替换`PChar`-&gt;`PAnsiChar`和`string`-&gt; AnsiString`。无论如何,在Unicode版本/环境中使用`FileNameW`更有意义。话虽如此,我个人还是会选择CF_HDROP,因为它还可以处理多个文件,并且您不能假设用户只复制了一个文件。(在这种情况下,`FileNameW`格式将返回列表中的第一个) (3认同)