我有这样的代码来将一些文本复制到剪贴板。
uses Clipbrd;
var
text: string;
begin
text := 'Some non-latin text, for example Russian: Привет!'
Clipboard.AsText := text;
end;
Win7-8 操作系统、操作系统区域设置中设置的俄语区域设置(和格式)、Delphi 7。
问题是,只有当我在复制时切换(shift+alt)到俄语键盘布局时,它才有效。否则,它将被粘贴为 "Ïðèâåò!"
而不是 "Привет!"
。
我该如何解决这个问题?
我认为我需要以某种方式将文本转换为 Unicode 并从 WinAPI 调用 Unicode 剪贴板复制函数?但如何做到这一点呢?
最佳答案
通过您认为合适的任何方式将文本转换为 Unicode。在 Delphi 7 中,通常涉及使用 WideString
。
将文本编码为 UTF-16 后(例如在 WideString
中),您需要使用 CF_UNICODETEXT
剪贴板调用 SetClipboardData
格式。它被 Delphi 包装为全局 Clipboard
对象的 SetAsHandle
方法。
我还没有测试过它,但这个函数应该可以帮助你:
uses
Windows, Clipbrd;
procedure SetClipboardText(const Text: WideString);
var
Count: Integer;
Handle: HGLOBAL;
Ptr: Pointer;
begin
Count := (Length(Text)+1)*SizeOf(WideChar);
Handle := GlobalAlloc(GMEM_MOVEABLE, Count);
Try
Win32Check(Handle<>0);
Ptr := GlobalLock(Handle);
Win32Check(Assigned(Ptr));
Move(PWideChar(Text)^, Ptr^, Count);
GlobalUnlock(Handle);
Clipboard.SetAsHandle(CF_UNICODETEXT, Handle);
Except
GlobalFree(Handle);
raise;
End;
end;
关于Delphi 7 : How to copy non-latin text to clipboard?(转换为 Unicode?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21707127/