Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Как узнать раскладку клавиатуры


Автор: YourLastSong 17.12.2011, 20:50
Здравствуйте, каким образом можно узнать, какая раскладка клавиатуры стоит у пользователя в данный момент?

Насколько я понял, делать это надо при помощи функции GetKeyboardLayout.

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

В качестве единственного параметра функции передаю значение 0, т.к. мне необходимо узнать раскладку именно для текущего потока.

Читаем MSDN:

Цитата

Return value

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 to the physical layout of the keyboard.


Следовательно, делаю так:

Код

HKL hk = GetKeyboardLayout (0);
int lang = LOWORD (hk);


Теперь смотрим сюда:

http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Для русской раскладки значение должно быть равно 0x0419.

Следовательно, делаем проверку в программе:

Код

if (lang == 0x0419)
{
...
}


Однако условие будет выполняться в любом случае, даже если раскладка клавиатуры в данный момент стоит англ.

Кстати, когда я делаю вот так

Код

std::cout << GetKeyboardLayout (0);


то на экран в любом случае выводится 04190419, несмотря на то, какая именно раскладка сейчас стоит.

Что я делаю не так?

Автор: Dem_max 18.12.2011, 05:52
Цитата

Следовательно, делаю так:
HKL hk = GetKeyboardLayout (0);
int lang = LOWORD (hk);


Все правильно и все работает на ура.

Автор: artsb 18.12.2011, 15:39
Цитата(Dem_max @  18.12.2011,  05:52 Найти цитируемый пост)
Все правильно и все работает на ура. 

Подтверждаю: для английской раскладки lang = 1033, для русской - 1049.

Автор: YourLastSong 18.12.2011, 17:43
В консольном приложении проверяли или как?

Меня просто именно консольное приложение интересует.

Автор: artsb 18.12.2011, 18:31
Хм... В консоли не работает. И похоже, решения нет...
http://www.rsdn.ru/forum/winapi/658469.hot.aspx

Автор: Dem_max 19.12.2011, 08:37
тебе чисто консольное интересует или же все таки приложение multithreaded ?

Автор: YourLastSong 24.12.2011, 15:19
Цитата
тебе чисто консольное интересует или же все таки приложение multithreaded ?


Честно говоря, не совсем понял вопроса.

Приложение консольное, однако имеет неск. потоков, которые создаю самостоятельно при помощи функции _beginthread.

Разве это имеет какое-то значение в данном случае вообще?

Что вы подразумеваете под выражением "чисто консольное приложение"?

Автор: bass 24.12.2011, 20:08
Есть одна идея но она тебе не понравится... Найти по названию окна ... Окошко с отображением раскладки.... Скопировать рисунок с этого окошка и сравнивать с эталонным изображением ...... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)