Указание языка помещенного в clipboard текста

Материал из DRKB

Указание языка помещенного в clipboard текста[править | править код]

Столкнулся с проблемой вставки в Clipboard русского текста в Win2K, WinXP. Залез в DRKB.. Ну да, там вариант предложен довольно смешной (создать TRichEdit, вставить в него clipboard, весь текст пометить русским, и вернуть в clipboard)... Всё бы ничего, но если у меня программа без форм, да и без окон вообще, то TRichEdit не создаётся ('Control has no parent window') . Почитал хелп, посмотрел, что именно Вынь сует в буфер на разных языках, и нашёл простой и красивый способ. Имхо, ему там и место - в разделе "Буфер обмена".Для указания языка текста в clipboard используется специальный формат . Данные в этом формате - это . При вставке текста в формате CF_TEXT, или CF_OEMTEXT, нужно просто добавить в формате , после чего Windows сможет правильно преобразовать имеющийся текст в недостающие форматы (например в CF_UNICODETEXT), да и просто будет корректно вставлен в самом CF_TEXT.

Как вставить русский текст в буфер обмена Windows 2000, Windows


procedure CopyDataToClipboard(fmt: word; s: string);
var
    hg: THandle;
    P: PChar;
begin
    hg := GlobalAlloc(GMEM_DDESHARE or GMEM_MOVEABLE, Length(S)+1);
    P := GlobalLock(hg);
    StrPCopy(P, s);
    GlobalUnlock(hg);
    Clipboard.Open;
    SetClipboardData(fmt, hg); // fmt = CF_UNICODETEXT | CF_OEMTEXT | CF_TEXT | CF_LOCALE
    Clipboard.Close;
    GlobalFree(hg);
end;

procedure CopyStringToClipboard(const s: string);
var Locale: word;
begin
  // Set CF_TEXT & CF_LOCALE
  CopyDataToClipboard(CF_TEXT, s);
  Locale := GetSystemDefaultLangID;  // Get it as you please. even hard-coded ;) $0419 = LANG_RUSSIAN (f.e.)
  CopyDataToClipboard(CF_LOCALE, Chr(Lo(Locale))+Chr(Hi(Locale)));
end;


Author: Mechanic
Source: Взято из http://forum.sources.ru
ID: 01899