Всем хай. Чето я голову сломал над этим сабжем При использовании SetClipboardData(CF_TEXT, происходит следующее: 1. Юзер переключается в русскую раскладку по Ctrl+Shift или Alt+Shift, заходит в моей проги в окно и там жмет правой кнопкой, где есть пункт смысл которого: Скопировать текст в буфер обмена. После этого он решает послать это своему другу по аське и вставляет в QIP окно спомощью Ctrl+V. Вуаля, русские буквы кажутся корректно и его друг Вася видит текст, все ок и все довольны! 2. Все тоже самое но юзер переключился в английскую раскладку, но из буфера обмена в QIP окно скопировалось некорректно и заместо русских букв крякозябры ( Вопрос: Как при любой активной раскладке клавиатуры, корректно копировать мульти-язык? Ведь может же быть не только русский, но и китайский? Нюансы: У юзера на ЭВМ может быть несколько раскладок: Татарская, Русская, Английская, но по дефолту как правило выбирают Английскую, но также бывают что выбирают и русскую, кто-то татарскую, Японцы наверно японскую выбирают в качестве дефолта.
dermatolog А ты попробуй Если я указываю CF_LOCALE, то у меня в буфере вообще ничего нет, по крайней мере Ctrl+V ничего невставляет ;( Код (Text): SetClipboardData(CF_LOCALE, hData); Приходится CF_TEXT. Вот из статьи в нэте, и подобное в MSDN: Т.е. смысл использовать CF_LOCALE нет! Я попросил пинать по существу, а в гугл даже новичок умеет послать
Стандартные компоненты Delphi используют тип string и в зависимости от одной директивы или настройки в проекте, этот тип принимает вид AnsiString или ShortString. Что в конечном итоге приводит к ANSI. Т.е. в буфер обмена я загоняю в ANSI ЗЫ: Скорее бы 2008,там обещали что string будут иметь тип WideString,т.е. в Delphi можно будет работать с UTF-16
EvilsInterrupt Так ведь можно и самому сконвертить в нужный формат. MultiByteToWideChar сам все сделает.
Atlantic Мысль! Спасибо Мысль-то она мысль, но пробемы не решает ;( Насколько я понимаю, происходит следующее: 1. Я ввожу в буфер CF_TEXT то, что есть а есть там русские буквы. Если я нахожусь на русской раскладке, то по закрытию буфера автоматически ставится CF_LOCALE, та которая сейчас, т.е русская. И та прога, что потом из буфера забирает может видит что это русская локаль и все хекс-коды, а среди них и русские буквы, распознаются нормально. 2. Если же копирую в буфер с CF_TEXT и на английской раскладке, то по закрытию ставится флаг, что все хекс-коды ни что иное как символы английского алфавита. Прога что читает этот буфер видит эти хексы и вывод на аглийском языке. Т.е. там где у нас на русском хекс-код отображает русскую букву "А", то в английском не обязательно тот же вид! Вот в этом-то и проблема, получается что копируя текст в буфер надо четко быть уверенным какой язык текста и именно такой локалью буфер и пометить.
EvilsInterrupt Тебе же сказали, сначала сконвертить в Юникод, а потом SetClipboardData(CF_UNICODETEXT, ...
EvilsInterrupt У меня таки получилось. По крайней мере, нижепроцитированный кусок программы вполне работает. Код (Text): function SetClipbrdText(Text:PUA_BinaryBlock; Locale:Cardinal; UseLocale:Boolean):Boolean; var hTextMem,hLocaleMem,textlen:Cardinal; pLocale:PCardinal; pText:PChar; begin Result:=False; begin if UseLocale then // Устанавливаем локаль для Clipboard begin if OpenClipboard(0) then EmptyClipboard; // Удаляем из Clipboard старую информацию hLocaleMem:=GlobalAlloc(GMEM_MOVEABLE+GMEM_ZEROINIT,SizeOf(Cardinal)); if hLocaleMem=0 then begin CloseClipboard; Exit; end else begin pLocale:=GlobalLock(hLocaleMem); if pLocale=nil then begin CloseClipboard; Exit; end else pLocale^:=Locale; if SetClipboardData(CF_LOCALE,hLocaleMem)=0 then begin CloseClipboard; LocalUnlock(hLocaleMem); GlobalFree(hLocaleMem); Exit; end; end;//else end;//if OpenClipboard end;//if UseLocale //Теперь пишем текст в Clipboard if OpenClipboard(0) then begin if not UseLocale then EmptyClipboard; // Если локаль не используется - надо очистить Clipboard textlen:=Text^.Header.ElemCount-1; // Один 0 в конце двоичного блока оставляем, т.к. это ASCIIZ-строка hTextMem:=GlobalAlloc(GMEM_MOVEABLE+GMEM_ZEROINIT,textlen); if hTextMem<>0 then begin pText:=GlobalLock(hTextMem); if pText=nil then begin CloseClipboard; GlobalUnlock(hTextMem); end //if pText=nil else begin Move(Text^.Arr[0],pText^,textlen); if SetClipboardData(CF_TEXT,hTextMem)=0 then begin CloseClipboard; GlobalUnlock(hTextMem); GlobalFree(hTextMem); Exit; end; CloseClipboard; GlobalUnlock(hTextMem); Result:=True; end; //else end else CloseClipboard; end;//if OpenClipboard(0) end;
CyberManiac Да не, думаю идея с UTF-16 более здравая ! Ведь по сути юникод- символ это уникальный код для любого символа И никогда не будет что один и тот хекс-код в русском одно, а в англ. другое )