Форум: "WinAPI";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
ВнизKeyboardLayout Найти похожие ветки
← →
GanibalLector © (2006-05-24 01:10) [0]Некие данные помещаю в буффер,а далее вставляю например в Excel. Так вот,если при копировании раскладка клавиатуры была не русская,то данные примут вид иероглифов.
Понятно,что нужно изменить раскладку. Вот собственно и вопрос : как правильно сделать???
1 вариант) использовать LoadKeyboardLayout. Но по непонятным причинам MemProf кричит,что нужно еще и UnloadKeyboardLayout.
См.Help и вижу обратное :
Функция может потерпеть неудачу по следующим причинам:
Был послан недопустимый дескриптор раскладки символов на клавиатуре.
Раскладка была предварительно загружена.
Раскладка находится в использовании.
Это получается,что пацаны из MemProf ошиблись???
2 вариант) используя ActivateKeyboardLayout и GetKeyboardLayoutName добраться до русского. Но google говорит,что это "правило плохого тона"... Кстати,непонятно кому такой тон не понравился ;)
З.Ы. И еще вопрос...в силу того,что ф-ции ActivateKeyboardLayout и LoadKeyboardLayout ведут себя по разному в 95 и NT.
Такое же будет поведение с Excel и буффером в 95/98?
Спасибо!
← →
MBo © (2006-05-24 10:05) [1]в буфер помещай юникод (CF_UNICODETEXT)
← →
GanibalLector © (2006-05-24 18:41) [2]2 MBo © (24.05.06 10:05) [1]
>в буфер помещай юникод (CF_UNICODETEXT)
Помещал.Только в этом случае при вставке в Excel"е вместо иероглифов будут вопросительные знаки. Если же вставлять в блокнот,то все нормально.
Поэтому и пошел по пути : ActivateKeyboardLayout и LoadKeyboardLayout
← →
GanibalLector © (2006-05-25 00:10) [3]???
← →
MBo © (2006-05-25 07:20) [4]У меня при обычной вставке в Excel идет такое: "Ôûâà ïðîëä"
А при использовании следующей функции (Alex Konshin) всё нормально:procedure SetClipboardText(const AText: string);
var
len, ulen: Integer;
hClip: THandle;
pClip: Pointer;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
len := Length(AText) + 1;
ulen := len + len;
hClip := GlobalAlloc(GMEM_MOVEABLE, ulen);
if hClip = 0 then
raise Exception.Create(SysErrorMessage(GetLastError))
else try
pClip := PWideChar(GlobalLock(hClip));
if pClip = nil then
raise Exception.Create(SysErrorMessage(GetLastError))
else begin
try
MultiByteToWideChar(1251, 0, PChar(AText), len, pClip, ulen);
finally
GlobalUnlock(hClip);
end;
Clipboard.SetAsHandle(CF_UNICODETEXT, hClip);
end;
except
GlobalFree(hClip);
raise;
end;
end
else begin
Clipboard.SetTextBuf(PChar(AText));
SetClipboardData(CF_LOCALE, LANG_RUSSIAN);
end;
end;
← →
GanibalLector © (2006-05-25 09:07) [5]2 MBo © (25.05.06 07:20) [4]
Да,именно этим кодом и пробовал. Версия Excel 2003 SP1.
При вставке получаю : ðóññêàÿ äåìîêðàòèÿ
← →
GanibalLector © (2006-05-26 09:07) [6]Странно...Неужели мой вопрос никому не интересен???
← →
GrayFace © (2006-05-26 10:56) [7]Я так делал:
type
ptr=pointer;
int=LongInt;
procedure SendKeyboardLayout(Wnd, Msg:int; lParam:int=0; wParam:int=0);
var a:HKL; s:string;
begin
SetLength(s,8);
Win32Check(GetKeyboardLayoutName(ptr(s)));
if s="00000409" then // If English
begin
a:=ActivateKeyboardLayout(
LoadKeyBoardLayout(ptr(intToHex(GetUserDefaultLangID,8)),0),0);
if a=0 then RaiseLastOSError;
SendMessage(Wnd, Msg, lParam, wParam);
if ActivateKeyboardLayout(a,0)=0 then RaiseLastOSError;
end else
SendMessage(Wnd, Msg, lParam, wParam);
end;
procedure TForm1.Copy1Click(Sender: TObject);
begin
SendKeyboardLayout(GetFocus, WM_COPY);
end;
procedure TForm1.Cut1Click(Sender: TObject);
begin
SendKeyboardLayout(GetFocus, WM_CUT);
end;
← →
Alarm © (2006-05-26 11:54) [8]Не знаю насколько корректно, но в своих приложениях, я делаю так:
Var russian, latin: HKL;
...
russian := LoadKeyboardLayout("00000419", 0);
latin := LoadKeyboardLayout("00000409", 0);
...
ActivateKeyboardLayout(russian, 0);
← →
GrayFace © (2006-05-26 12:10) [9]> Alarm © (26.05.06 11:54) [8]
В приведенном коде не видно восстановления раскладки. И привязка к русскому языку - это криво.
← →
Alarm © (2006-05-26 12:19) [10]>GrayFace © (26.05.06 12:10) [9]
Действительно, восстановления раскладки не видно:(
у меня только переключения - для восстановления латиницы:ActivateKeyboardLayout(latin, 0);
← →
GanibalLector © (2006-05-27 01:34) [11]2 GrayFace © (26.05.06 12:10) [9]
Можно подумать у тебя ровно ;) А если у меня еще французкий и немецкий??? Что тогда???
if s<>"00000419" then // если НЕ русский
← →
GrayFace © (2006-05-27 06:45) [12]Ну, чтоб edit"а разрулить французский и немецкий можно только зная кое-что о charset"е edit"а. У меня если французский и немецкий и включен один из них, то с английского будет переключение на язык по умолчанию, а между французским и немецким уже никак. Если все charset"ы = DEFAULT_CHARSET, наверное, можно заменить
if s="00000409" then // If English
наif StrToInt("$"+s)<>GetUserDefaultLangID then
.
← →
GrayFace © (2006-05-27 06:58) [13]Да нет, у меня вроде все нормально кроме того, что идет работа со стоками. Если Charset=DEFAULT_CHARSET, то все будет чисто. VCL итак накладывает ограничение - можно видеть только язык указанный в Charset и английский. Конечно, в этой ситуации мой код не спасет, но и ничего не испортит. Неправильная работа возможна только если установлен английский Charset и в Memo имеются спец. символы этого Charset"а - всякие буквы сточками над ними.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c