Привет всем!
Про то, что некоторые юзеры любят лезть в настройку "Язык и стандарты" и как с этим бороться, уже написано много. Но все же...
У меня стоит Default locale = Русский, язык по умолчанию английский, больше ничего не исправлял — для чистоты эксперимента.
Забиваю число в строку ввода, жму точку на цифровой клавиатуре — появляется запятая. Известно, почему — русский язык выбран. Переключаюсь на английский — вместо запятой идет точка. Все нормально, кроме самого главного — как определить текущий язык ввода?
Я пишу на Delphi, MSDN у меня есть и я в нем более-менее ориентируюсь.GetUserDefaultLCID дает фиксированное значение, GetLocaleInfo тем более от него зависит. GetKeyboardLayoutList тоже не из этой оперы...
Как определить, на каком языке вводится текст и какие в нем настройки даты/валюты/чисел/...?
Заранее спасибо.
Здравствуйте, BaSergey, Вы писали:
BS>Привет всем! BS>Про то, что некоторые юзеры любят лезть в настройку "Язык и стандарты" и как с этим бороться, уже написано много. Но все же... BS>У меня стоит Default locale = Русский, язык по умолчанию английский, больше ничего не исправлял — для чистоты эксперимента. BS>Забиваю число в строку ввода, жму точку на цифровой клавиатуре — появляется запятая. Известно, почему — русский язык выбран. Переключаюсь на английский — вместо запятой идет точка. Все нормально, кроме самого главного — как определить текущий язык ввода?
BS>Я пишу на Delphi, MSDN у меня есть и я в нем более-менее ориентируюсь.GetUserDefaultLCID дает фиксированное значение, GetLocaleInfo тем более от него зависит. GetKeyboardLayoutList тоже не из этой оперы...
BS>Как определить, на каком языке вводится текст и какие в нем настройки даты/валюты/чисел/...? BS>Заранее спасибо.
Здравствуйте, BaSergey, Вы писали:
BS>HKL и LCID — это одно и то же?
Из MSDN про GetKeyboardLayout :
The return value is the input locale identifier for the thread. The low word contains a language identifier for the input language and the high word contains a device handle for the physical layout of the keyboard.
BS>Я не нашел функции GetLocalInfo...
Здравствуйте, SergH, Вы писали:
SH>Из MSDN про GetKeyboardLayout :
SH>The return value is the input locale identifier for the thread. The low word contains a language identifier for the input language and the high word contains a device handle for the physical layout of the keyboard.
GetKeyboardLayout действительно отслеживает изменения языка. Но GetLocaleInfo с его результатом работать отказывается. Вот, что я делаю для проверки:
function GetLocaleChar(Locale, LocaleType: Integer; Default: Char): Char;
var
Buffer: array[0..1] of Char;
begin
if GetLocaleInfo(Locale, LocaleType, Buffer, 2) > 0 then
Result := Buffer[0] else
Result := Default;
end;
Application.MessageBox(PChar(format(
'Lo=%4x; Hi=%4x; Char=[%s]',
[LoWord(GetKeyboardLayout(0)), HiWord(GetKeyboardLayout(0)),
GetLocaleChar(GetKeyboardLayout(0), LOCALE_SDECIMAL, 'D')])),
'Info', mb_Ok or mb_IconInformation);
Результат работы GetLocaleChar всегда равен "D". А если ему дать результат чего-нибудь типа GetThreadLocale — все нормально, но результат не тот, что хотелось — постоянно то, что прописано в панели управления. Мне же нужен конкретно тот разделитель, который действует непосредственно сейчас, для текущего языка ввода.
Здравствуйте, BaSergey, Вы писали:
SH>The return value is the input locale identifier for the thread. The low word contains a language identifier for the input language and the high word contains a device handle for the physical layout of the keyboard.
BS>GetKeyboardLayout действительно отслеживает изменения языка. Но GetLocaleInfo с его результатом работать отказывается. Вот, что я делаю для проверки: BS>
...
BS>
BS>Результат работы GetLocaleChar всегда равен "D". А если ему дать результат чего-нибудь типа GetThreadLocale — все нормально, но результат не тот, что хотелось — постоянно то, что прописано в панели управления. Мне же нужен конкретно тот разделитель, который действует непосредственно сейчас, для текущего языка ввода.
BS>Есть соображения?
Есть. Извини, сам проверить сейчас не могу, но, имхо что бы получить LCID из GetKeyboardLayout нужно делать так: