delphi - 如何将自定义格式的剪贴板数据粘贴到 TMemo 中?

标签 delphi winapi clipboard gpx tmemo

此问题引用this及其 accepted answer 之一发布在 stackoverflow 上。

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

探路EasyGPS通过 Topografix处理剪贴板操作,我发现它使用名为 GPX 的自定义剪贴板格式,它实际上是纯 XML 文本(准确地说 GPX)。排除使用 Clipboard.AsText。

我在这个阶段遇到了困难:

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。

我什至加入了错误检查!

关于delphi - 如何将自定义格式的剪贴板数据粘贴到 TMemo 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8695081/

相关文章:

Delphi OLE 自动化卡住 GUI

c# - 停止进程显示来自 C# 的窗口

java - 使用默认编辑器套件将文本放在系统剪贴板上

java - 如何阻止 Netbeans IDE 8.1 插入额外的反斜杠 "\"?

javascript - 在自定义上下文菜单中实现 'Paste'

delphi - 在 Borland Delphi 中将浮点或负整数转换为十六进制

delphi - 具有 VCL 样式的 TComboBoxEx : Borders flicker

delphi - 刷新DBGrid后选择行

c++ - 如何使用 HKLM\SYSTEM\CurrentControlSet\Enum 获取设备列表及其参数?

winapi - 微软在Excel中使用的PDF库是否可供外界使用?