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

前端之家收集整理的这篇文章主要介绍了delphi – 如何将自定义格式剪贴板数据粘贴到TMemo中?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题是指 this一个及其 accepted answer发布在stackoverflow上.

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

探索Topografix 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,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.

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

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

我甚至把错误检查!

猜你在找的Delphi相关文章