Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/96: Рейтинг темы: голосов - 96, средняя оценка - 4.70
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112

Как сменить раскладку клавиатуры

16.12.2011, 10:22. Показов 20598. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые господа.

Каким образом можно сменить раскладку клавиатуры в консольном приложении?
Пробовал таким образом:
C++
1
LoadKeyboardLayout ("00000409", KLF_ACTIVATE | KLF_SETFORPROCESS);
Ставил также "00010409" и "00020409".
Раскладка появляется в списке доступных, но активной не становится.
Почему?
Пробовал также ActivateKeyboardLayout.
Что не так?
Заранее благодарю за возможные ответы.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2011, 10:22
Ответы с готовыми решениями:

Сохранить раскладку клавиатуры в реестре
Добрый день, подскажите как можно сохранить раскладку в реестре, я хочу добавить скажем раскладку русский-испанский, как это вообще можно...

Определить раскладку клавиатуры и изменить ее
Задания на работу с API-функциями 1. Определить версию операционной системы и платформу. Определить раскладку клавиатуры и изменить...

Программно эмулировать нажатие клавиш, различая регистр и раскладку клавиатуры
Функция keybd_event корректно воспринимает только большие латинские буквы. Регистр и раскладка определяются нажатием клавиш CapsLock и...

12
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
16.12.2011, 12:12
Почитайте здесь http://www.firststeps.ru/mfc/winapi/keyb/r.php?15
и ниже запись с одного блога (мне правда влом сейчас писать свитчер)
Функция ActivateKeyboardLayout активизирует другую раскладку символов на клавиатуре и устанавливает активную раскладку символов в целом для системы, а не для вызывающего потока.

Синтаксис

BOOL ActivateKeyboardLayout(
HKL hkl, // дескриптор раскладки клавиатуры
UINT Flags // флажки раскладки клавиатуры
);

Параметры
hkl — Идентифицирует раскладку символов на клавиатуре, которая будет активизирована. Раскладка должна быть загружена предыдущим вызовом функции LoadKeyboardLayout. Этот параметр должен быть или дескриптор раскладки символов на клавиатуре или одно из следующих значений:

HKL_NEXT - Выбирает следующую раскладку в списке раскладок символов на клавиатуре, поддерживаемых системой.
HKL_PREV - Выбирает предыдущую раскладку в списке раскладок символов на клавиатуре, поддерживаемых системой.
Flags — Определяет, какая раскладка символов на клавиатуре должна быть активизирована. Этот параметр может быть одним из следующих значений:

KLF_REORDER - Если этот бит установлен, кольцевой список системы загруженных раскладок символов на клавиатуре переупорядычевается. Если этот бит не установлен, список чередуется без изменения порядка. Например, если пользователь имел активной Английскую раскладку, а также имеет загруженные Французскую, Немецкую и Испанскую раскладки (вот в таком порядке), то активизация Немецкой раскладки с установленным битом KLF_REORDER создаст следующий порядок: Немецкая, Английская, Французская, Испанская раскладки. Активизация Немецкой раскладки без установки значения KLF_REORDER создала бы следующий порядок: Немецкая, Испанская, Английская, Французская раскладки.Если загружены меньше чем три раскладки символов на клавиатуре, значение этого флажка не применяется.
KLF_UNLOADPREVIOUS - Предварительно загружает активную раскладку клавиатуры.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - ИСТИНА (TRUE).
Если функция не выполняет задачу, величина возвращаемого значения - ЛОЖЬ(FALSE). Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

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

________________________________________ ___

Функция LoadKeyboardLayout загружает раскладку символов на клавиатуре.

Синтаксис

HKL LoadKeyboardLayout(
LPCTSTR pwszKLID, // адрес буфера с названием раскладки
UINT Flags // флажки раскладки клавиатуры
);

Параметры
pwszKLID — Указывает на буфер, который определяет название раскладки символов на клавиатуре. Название должно быть получено из шестнадцатеричного значения идентификатора языка, соответствующего раскладке. Например, Американский Английский язык имеет идентификатор языка 0x0409, так что первичная Американская Английского языка раскладка называется "00000409". Варианты Американской Английского языка раскладки, типа раскладки Дворака, названы "00010409", "00020409", и так далее. За списком первичных идентификаторов языка и идентификаторов подмножества языка, которые составляют идентификатор языка, следит макрокоманда MAKELANGID.

Flags — Устанавливает, как раскладка символов на клавиатуре должна быть загружена. Этот параметр может быть одним из следующих значений:

KLF_ACTIVATE - Функция загружает раскладку, если она ещё не загружена, и активизирует её. Это значение активизирует раскладку для системы, взятой в целом, а не только для вызывающего потока.
KLF_REORDER - Этот флажок значим, только тогда, если установлен флажок KLF_ACTIVATE, а раскладка уже загружена. Если эти условия выполнены и бит KLF_REORDER установлен, функция удаляет заданную раскладку из её позиции в круговом списке системы загруженных раскладок и перемещает её в голову списка как активную раскладку.Если бит KLF_ACTIVATE установлен и раскладка загружена, но бит KLF_REORDER не установлен, функция просто вращает круговой список загруженных раскладок в системе.Если флажок KLF_ACTIVATE установлен, а раскладка ещё не загружена, она загружается как активная раскладка и вставляется в системный круговой список раскладок клавиатуры впереди активной предыдущей раскладки.
KLF_SUBSTITUTE_OK - Заданная раскладка ищет в конфигурации пользователя (в системном реестре под ключом HKEY_CURRENT_USER\Keyboard Layout\Substitutes) раскладку замены, предпочитаемую пользователем. Например, если в этом разделе имелось значение названия "00000409" равное "00010409", загружается Американская Английского языка раскладка ("00000409") с установкой флажка KLF_SUBSTITUTE_OK, который заставит быть загруженной раскладку США Английского языка Дворака ("00010409")
KLF_UNLOADPREVIOUS - Если флажок KLF_ACTIVATE установлен, а раскладка успешно загружена и активизирована, функция выгружает активную предыдущую раскладку. Иначе, функция игнорирует этот флажок.
Возвращаемые значения
Если функция завершается успешно, величина возвращаемого значения - дескриптор раскладки символов на клавиатуре.
Если функция не выполняет задачу, величина возвращаемого значения - ПУСТО (NULL). Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Одновременно могут быть загруженными несколько раскладок символов на клавиатуре, но активной может быть только одна. Загрузка многочисленных раскладок символов на клавиатуре делает возможным быстро переключаться между ними.
1
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
16.12.2011, 14:51  [ТС]
Да, уже видел.

К тому же, я сказал, что использовал уже как LoadKeyboardLayout, так и ActivateKeyboardLayout с разными флагами.
0
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
17.12.2011, 15:16  [ТС]
Почему-то не работает даже проверка на то, какая именно раскладка стоит у пользователя в данный момент.

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

http://msdn.microsoft.com/en-u... s.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.
Следовательно, делаю так:

C++
1
2
HKL hk = GetKeyboardLayout (0);
int lang = LOWORD (hk);
Теперь смотрим сюда:

http://msdn.microsoft.com/en-u... s.85).aspx

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

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

C++
1
2
3
4
if (lang == 0x0419)
{
...
}
Однако условие будет выполняться в любом случае, даже если раскладка клавиатуры в данный момент стоит англ.

Что я делаю не так?
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
17.12.2011, 19:11
Не может такого быть, ты где-то напортачил. Вылаживай код с проверкой, посмотрим.
0
1 / 1 / 0
Регистрация: 12.12.2010
Сообщений: 112
17.12.2011, 20:46  [ТС]
Так ведь это и есть вся проверка.

C++
1
2
3
4
5
6
HKL hk = GetKeyboardLayout (0);
int lang = LOWORD (hk);
if (lang == 0x0419)
{
...
}
Кстати, когда я делаю вот так

std::cout << GetKeyboardLayout (0);

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

Почему?
0
32 / 32 / 4
Регистрация: 19.12.2011
Сообщений: 72
21.12.2011, 08:16
Лучший ответ Сообщение было отмечено как решение

Решение

Вот:
C
1
PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, 2, 0);
Переключение раскладки для текущего окна. Эквивалентно нажатию <CTRL>+<SHIFT>. Окно можно и явно задать.
Вот, собственно. Можно ещё и WM_INPUTLANGCHANGE глянуть. Оно?
7
lordkim
23.07.2012, 19:38
2kisssko:
Не нашел кнопку "Спасибо"!
Не спал, простите, всю ночь, не работало ни ActivateKeyboardLayout ни Load

А теперь заработало! =)
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,852
Записей в блоге: 15
12.02.2021, 12:43
Мне тоже надо похожее, но как я понял WinAPI - это отдельная тема и к языку Си не имеет отношения. Написал интуитивно на подобном примере из темы, вроде работает. Поправьте пожалуйста если не так что то. Код для Си
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <Windows.h>
 
int main(void)
{
    HKL hk = GetKeyboardLayout (0);
    int lang = LOWORD (hk);
    if (lang == 0x0419)
    {
        printf("RUS - active\nswith - ENG\n"); // proverka
        PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, 2, 0);
        system("C:/Users/AspireM3400/Desktop/forum2.exe");
    }
return 0;
}
Даа..в коде дописал, если язык был включен русский, то запускается файл.
0
Just Do It!
 Аватар для XLAT
4189 / 2644 / 654
Регистрация: 23.09.2014
Сообщений: 8,901
Записей в блоге: 3
12.02.2021, 22:04
Лучший ответ Сообщение было отмечено мама Стифлера как решение

Решение

мама Стифлера,
у меня это работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <Windows.h>
 
enum MYLANG
{   MY_ENG = 0x409,
    MY_RUS = 0x419
};
 
int main(void)
{   
    int lang =  LOWORD (GetKeyboardLayout (::GetCurrentThreadId()));
    while(true)
    {   
        if (lang == MY_RUS)
        {   printf("ENG - on\n");
            PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST,
                        INPUTLANGCHANGE_SYSCHARSET, MY_ENG);
            lang = MY_ENG;
        }
        else
        {   printf("RUS - on\n");
            PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST,
                        INPUTLANGCHANGE_SYSCHARSET, MY_RUS);
            lang = MY_RUS;
        }
        getchar();        
    }    
}
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,852
Записей в блоге: 15
12.02.2021, 22:41
XLAT, ооо я уже забыл про эту тему, прошу прощения Пока рыскал в поисках ответов, успел нафлудить в чужих темах.
Моя тема тут и как бы все уже решил и работает, ну если только последний пост. Возможно, или нет. Си (Windows API) не запускается файл
0
Just Do It!
 Аватар для XLAT
4189 / 2644 / 654
Регистрация: 23.09.2014
Сообщений: 8,901
Записей в блоге: 3
12.02.2021, 22:47
Цитата Сообщение от мама Стифлера Посмотреть сообщение
я уже забыл про эту тему
почему я не задаю здесь на форуме вопросов:
пока соберусь, ответ сам появляется из ниоткуда.
0
из племени тумба-юбма
 Аватар для мама Стифлера
2523 / 1819 / 419
Регистрация: 29.11.2015
Сообщений: 8,852
Записей в блоге: 15
12.02.2021, 23:01
Цитата Сообщение от XLAT Посмотреть сообщение
пока соберусь, ответ сам появляется из ниоткуда
вот тут вы в корне не правы. У меня ответ появился только что. Как раз после вашего сообщения #10, где по счастливой случайности, вы написали именно то, что я спрашивал в своей теме)))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2021, 23:01
Помогаю со студенческими работами здесь

Как программно сменить раскладку клавиатуры
Подскажите пожалуйста, как сменить раскладку клавиатуры на английскую, если в системе установлено три более языка? Вот эта штука...

Как сменить раскладку клавиатуры на Английскую по клику по Edit
Как сменить раскладку клавиатуры на Английскую по клику по Edit !!

Сменить раскладку клавиатуры
Добрый вечер! Кто может подсказать как сменить раскладку клавиатуры, н-р при нажатии на кнопку? Текущую раскладку определить могу...

Автоматически сменить раскладку клавиатуры
Доброго дня!. Подскажите почему у меня не получается сменить автоматически раскладку клавиатуры. с++ Builder XE4 void...

Как определить раскладку клавиатуры?
Товарищи, подскажите. Как определить какая сейчас раскладка клавиатуры (рус/анг)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru