delphi – 如何将自定义格式剪贴板数据粘贴到TMemo中?
发布时间:2020-12-15 10:04:15 所属栏目:大数据 来源:网络整理
导读:这个问题是指 this一个及其 accepted answer发布在stackoverflow上. 我对Windows API编程感到不舒服. 探索Topografix Topografix处理剪贴板操作的方式,我发现它使用名为GPX的自定义剪贴板格式,它实际上是纯XML文本(准确地说是GPX).使用Clipboard.AsText被排
这个问题是指
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. 我甚至把错误检查! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |