此问题引用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/