men*_*raz 2 delphi clipboard winapi tmemo gpx
这个问题引用了这个问题以及在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.
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题.
我写的是这样的:
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.
Run Code Online (Sandbox Code Playgroud)
请注意,我移动了剪贴板Open命令,该命令将剪贴板锁定在CF_GPX格式测试之外.这是为了避免代码中存在竞争条件.在您的代码中,可以在HasFormat呼叫和OpenClipboard呼叫之间修改剪贴板.
我也Clipboard专门使用这个课程.这个类有你需要的所有,你不需要使用原始的Win32剪贴板API.
我甚至把错误检查!