如何将自定义格式的剪贴板数据粘贴到备忘录中



这个问题是指这个问题以及它在stackoverflow上发布的公认答案。

我对Windows API编程感到不舒服。

探索EasyGPS由Topografix处理剪贴板操作的方式,我发现它使用自定义剪贴板格式命名为GPX,这实际上是纯XML文本(GPX精确)。使用剪贴板。不包括文本。

我在这个阶段绊倒了:

program ProbeClipboard;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  Windows,
  ClipBrd;
var
  CF_GPX: Cardinal;
  ClipboardData: THandle;
begin
  CF_GPX:=RegisterClipboardFormat('GPX');
  if ClipBoard.HasFormat(CF_GPX) then
  begin
    Writeln('GPX format available in clipboard');
    //
    OpenClipboard(0);
    ClipboardData := GetClipboardData(CF_GPX);
    if ClipboardData = 0 then
      raise Exception.Create('Clipboard data Error');
    /// How to use GlobalLock and GlobalUnLock
    /// so that I can paste the Clipboard data
    /// to a TMemo instance for example
    CloseClipboard;
  end;
end.

请帮我修一下那个程序

我会这样写:

program ProbeClipboard;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  Windows,
  ClipBrd;
var
  CF_GPX: Cardinal;
  ClipboardData: Windows.HGLOBAL;
  Ptr: Pointer;
  Size: DWORD;
begin
  CF_GPX := RegisterClipboardFormat('GPX');
  Clipboard.Open;
  try
    if Clipboard.HasFormat(CF_GPX) then
    begin
      Writeln('GPX format available in clipboard');
      ClipboardData := Clipboard.GetAsHandle(CF_GPX);
      if ClipboardData=0 then
        RaiseLastOSError;
      Ptr := Windows.GlobalLock(ClipboardData);
      if Ptr=nil then
        RaiseLastOSError;
      try
        Size := Windows.GlobalSize(ClipboardData);
        //Ptr now points to a memory block of Size bytes 
        //containing the clipboard data
      finally
        Windows.GlobalUnlock(ClipboardData);
      end;
    end;
  finally
    Clipboard.Close;
  end;
end.

注意,我移动了剪贴板Open命令,该命令将剪贴板锁定在CF_GPX格式的测试之外。这是为了避免存在于代码中的竞争条件。在代码中,可以在HasFormat调用和OpenClipboard调用之间修改剪贴板。

我还专门使用了Clipboard类。这个类有所有你需要的,你不需要使用原始的Win32剪贴板API。

我甚至把错误检查!

相关内容

  • 没有找到相关文章

最新更新