Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Как определить раскладку? (https://forum.antichat.xyz/showthread.php?t=64323)

_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

Цитата:

Сообщение от Jes
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

Цитата:

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

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

noobyara 15.03.2008 01:23

Цитата:

Сообщение от _nic
Аналогично,сколько 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

Цитата:

Сообщение от desTiny
Придумал гениальный способ:
читаешь символы, после этого:
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 сравниваешь и всё )


Время: 05:59