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;
}
• Для получения корректного текста естественно мне нужно реализовать возможность detect-ить в режиме реального времени текущую раскладку клавиатуры.
Чтоб в результате я мог получить что-то типа:
Int layout = 1 // для en_US
else
layout = 2 // для ru_RU
и в зависимости от этого меняться будут буковки, вводимые в +string в зависимости от нажатых клавиш.
Ну то не беда, беда в том, что у меня по каким-то причинам не хочет детектиться раскладка в режиме реал тайма.
Как итог я не смогу сделать нормальную запись в String чего-то вроде: "This is latin layout а вот это уже кириллица"
Помогите пожалуйста.