如何将自定义格式的剪贴板数据粘贴到 TMemo 中?
这个问题指的是这个及其已接受的答案发布在 stackoverflow 上。
我对 Windows API 编程感到不舒服。
探索 EasyGPS by 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.
请帮我修复该程序。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我会这样写:
请注意,我移动了剪贴板
Open
命令,该命令将剪贴板锁定在CF_GPX
格式的测试之外。这是为了避免代码中存在竞争条件。在您的代码中,可以在HasFormat
调用和OpenClipboard
调用之间修改剪贴板。我还专门使用了
Clipboard
类。此类拥有您所需的一切,并且无需使用原始 Win32 剪贴板 API。我什至加入了错误检查!
I'd write it like this:
Note that I moved the clipboard
Open
command, which locks the clipboard to be outside the test for theCF_GPX
format. That is to avoid a race condition which exists in your code. In your code the clipboard could be modified between theHasFormat
call and theOpenClipboard
call.I also used the
Clipboard
class exclusively. This class has all you need and you don't need to use the raw Win32 clipboard API.I even put error checking in!