Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ | Надо создать фрагмент кода для определения текущей раскладки клавиатуры в режиме реального времени

амогус228 Гуру (3038), на голосовании 3 месяца назад
• Хочу создать программулину, которая будет в некий String записывать всякий разный вводимый пользователем текст.
• Для получения корректного текста естественно мне нужно реализовать возможность detect-ить в режиме реального времени текущую раскладку клавиатуры.

Чтоб в результате я мог получить что-то типа:
Int layout = 1 // для en_US
else
layout = 2 // для ru_RU

и в зависимости от этого меняться будут буковки, вводимые в +string в зависимости от нажатых клавиш.

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

Как итог я не смогу сделать нормальную запись в String чего-то вроде: "This is latin layout а вот это уже кириллица"

Помогите пожалуйста.
Голосование за лучший ответ
Данил Ласый Просветленный (32996) 4 месяца назад
Подключи русский язык. Компилятор сам определяет. Ничего сложного
/bin/laden Искусственный Интеллект (113078) 4 месяца назад
• Хочу создать программулину, которая будет в некий String записывать всякий разный вводимый пользователем текст.
ну да, ну да...
амогус228Гуру (3038) 4 месяца назад
тихо
Mr Undexpented Мастер (1873) 4 месяца назад
#include <iostream>
#include <string>
#include <windows.h>
#include <thread>

// Функция для получения идентификатора текущей раскладки клавиатуры
int GetKeyboardLayoutId() {
HKL layout = GetKeyboardLayout(0);
// Получаем языковой идентификатор из раскладки клавиатуры
LANGID langId = LOWORD(layout);
// Возвращаем 1 для en_US и 2 для ru_RU
switch (PRIMARYLANGID(langId)) {
case LANG_ENGLISH:
return 1;
case LANG_RUSSIAN:
return 2;
default:
return 0; // Неопознанная раскладка
}
}

// Функция для получения ввода с клавиатуры
void GetKeyboardInput(std::string &input) {
while (true) {
if (GetAsyncKeyState(VK_RETURN) & 0x8000) {
break; // Останавливаем ввод при нажатии Enter
}

for (char c = 'A'; c <= 'Z'; ++c) {
if (GetAsyncKeyState(c) & 0x8000) {
int layout = GetKeyboardLayoutId();
if (layout == 1) {
input += c; // Латинские буквы
} else if (layout == 2) {
// Преобразуем латинскую букву в кириллическую
wchar_t wc = c - 'A' + L'А';
char mbstr[3];
WideCharToMultiByte(CP_UTF8, 0, &wc, 1, mbstr, 3, nullptr, nullptr);
input += mbstr;
}
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // Исключаем повторное срабатывание
}
}
}
}

int main() {
std::string input;
std::cout << "Введите текст (нажмите Enter для завершения):" << std::endl;

std::thread inputThread(GetKeyboardInput, std::ref(input));
inputThread.join();

std::cout << "Введенный текст: " << input << std::endl;
return 0;
}
НОВОСТИ ДНЯ Мудрец (14230) 4 месяца назад
... вот смотри если это как ты предполагаеш
Int layout = 1 // для en_US
else
layout = 2 // для ru_RU то логично вытекает и следующий сигмент =
Int layout = 1 // для en_= НОВОСТИ ДНЯ
else
layout = 2 // для ru_RU... но это если в двоичной система
Похожие вопросы