问题描述:

I have code like this to copy some text to clipboard.

uses Clipbrd;

var

text: string;

begin

text := 'Some non-latin text, for example Russian: Привет!'

Clipboard.AsText := text;

end;

Win7-8 OS, Russian locale (and format) set in OS Region settings, Delphi 7.

The problem is that it works only when I switch (shift+alt) to Russian keyboard layout when copying. Otherwise it will be pasted as "Ïðèâåò!" instead of "Привет!".

How can I fix that?

I think that I need somehow convert text to Unicode and call Unicode clipboard copy function from WinAPI? But how to do that?

网友答案:

Convert the text to Unicode by whatever means you see fit. In Delphi 7 that typically involves using WideString.

Once you have the text encoded as UTF-16, for instance in a WideString, you need to call SetClipboardData using the CF_UNICODETEXT clipboard format. This is wrapped by Delphi as the SetAsHandle method of the global Clipboard object.

I've not tested it, but this function should set you on the way:

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;
相关阅读:
Top