这个问题是指
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.
我甚至把错误检查!