PDA

Просмотр полной версии : Как определить раскладку?


_nic
14.03.2008, 20:45
Надо определить чем вводится текст кириллицей или латинецей.Естетвенно я знаю о GetLocaleInfo но оно как им некрути возращает только 0419 :( А мне нада както узнать вводится ли руский текст или английский.

Jes
14.03.2008, 20:56
if GetKeyboardLayout(GetWindowThreadProcessId(GetFore groundWindow, null)) == 67699721
//раскладка английская
else
//раскладка НЕанглийская, например 68748313 соответствует русской

вроде так ...

_nic
14.03.2008, 21:13
if GetKeyboardLayout(GetWindowThreadProcessId(GetFore groundWindow, null)) == 67699721
//раскладка английская
else
//раскладка НЕанглийская, например 68748313 соответствует русской

вроде так ...
Мне нада это сделать в консольной проге.А GetWindowThreadProcessId насколько я понимаю без WinMain непокатит.

noobyara
14.03.2008, 21:24
Видимо правильнее сравнивать не возвращаемое значение, а его low word с индификатором раскладки. к примеру:

HKL hKl = GetKeyboardLayout(GetCurrentThreadId());
WORD id = LOWORD(hKl));

switch(id){
case 0x0419:break;//рус
case 0x0409:break;//анг
}

И если тебя надо знать раскладку только твоего приложения(с учетом того что оно однопоточное), используй GetCurrentThreadId() вместо GetWindowThreadProcessId()

и

The return value is the keyboard layout handle for the thread. The low word contains a locale identifier identifying the input language and the high word contains a device handle identifying the physical layout of the keyboard.

Forcer
14.03.2008, 23:01
У меня подобный код показывает только раскладку по-умолчанию, а совсем не ту, которая включена. В чём может быть проблема?

_nic
15.03.2008, 00:45
У меня подобный код показывает только раскладку по-умолчанию, а совсем не ту, которая включена. В чём может быть проблема?
Аналогично,сколько Alt+Shift неклацай выдает одно и тоже значение.

noobyara
15.03.2008, 01:23
Аналогично,сколько Alt+Shift неклацай выдает одно и тоже значение.

просто у вас консольное приложение, там система ввода-вывода по другому устроена и код написанный выше, будет работать только с оконным приложением..

desTiny
15.03.2008, 09:48
Придумал гениальный способ:
читаешь символы, после этого:
if (('a' < ch) and (ch < 'z')) or (('A' < ch) and (ch < 'Z')) then
// английская раскладка
else
// русская...

_nic
15.03.2008, 12:15
Придумал гениальный способ:
читаешь символы, после этого:
if (('a' < ch) and (ch < 'z')) or (('A' < ch) and (ch < 'Z')) then
// английская раскладка
else
// русская...
Не махлюй надо средствами WinAPI :D

KindEcstasy
15.03.2008, 16:57
чё мудрить то? =\


buffer db KL_NAMELENGTH dup (?)

push offset buffer
call GetKeyboardLayoutName



потом lstrcmp сравниваешь и всё )

desTiny
15.03.2008, 23:01
Не махлюй надо средствами WinAPI :D
А ето что?
ReadConsoleA, потом проверяешь то что счситал=)

_nic
16.03.2008, 14:13
думаю вопрос исчерпан