“Самоидентификация” клавиатуры

Встроил индикацию раскладки непосредственно в саму клавиатуру.

Встроил индикацию раскладки непосредственно в саму клавиатуру.

«Я — русский!»‑ спел недавно известный певец. Да и я, после 20 лет пользования клавиатурой, наконец‑то, устал вечно поправлять текст, набранный не в той раскладке клавиатуры (в голове держать всё невозможно!) и сделал индикацию текущей раскладки. Казалось бы, мелочь, а приятно.

А раньше как бывало? Оторвал взгляд от клавы, посмотрел на экран… «Фу, чёрт! Не та раскладка!» Стираешь то, что набрал непосильным трудом и заново набираешь тот же текст.

Вы скажете: «Не интересное решение! Есть же замечательная программа Punto Switcher! Она может автоматически исправлять набранный текст в нужную раскладку.» Но всегда оставалась проблема набрать специальные символы независимо от языка ввода. И вот тут‑то Punto Switcher начинал ошибаться.

А нельзя ли поставить прямо возле клавиш небольшой экранчик OLED (благо таких стало в продаже много) и выводить на него текстом текущую раскладку аж по всем языкам мира? Можно. Но как показал мой дальнейший опыт, увидеть свечение боковым взглядом проще, чем вглядываться в надпись на экранчике. Кроме того, обычно мало кто пользуется одновременно более чем тремя языками раскладки. Да и по цене решение со свечением светодиодами будет гораздо дешевле.

Вот я так и пошёл по этому простому пути. И замутил банальную схему:

Схема индикации раскладки клавиатуры.

Схема индикации раскладки клавиатуры.

Как видим, на схеме главным элементом является китайская «копеечная» микросхема‑преобразователь из usb в rs232 ttl‑уровней CH340C. Можно использовать подобный преобразователь любого другого производителя,  лишь бы у него были выведены сигналы TX, RX, RTS, DTR.

Когда такой преобразователь подключаем к компьютеру через USB, то в системе появляется новый COM‑порт с каким‑нибудь номером. И чтобы его идентифицировать среди прочих COM‑портов, на схеме я замкнул между собой выводы TX и RX. Теперь, посылая из обслуживающей индикацию раскладки программы какой‑нибудь проверочный байт, можно найти тот самый «родной» COM‑порт.

Сигнал RTS служит для индикации одного дополнительного языка раскладки (например, свечением красного светодиода), а DTR — для индикации дополнительного второго языка (например, свечением зелёного светодиода). Полное отсутствие свечения будет означать «индикацию» основного языка раскладки.

Обслуживающую индикацию раскладки программу для ОС Windows 7 и выше, я написал на языке C# (ссылки на неё внизу статьи). И её можно поместить в автозагрузку. Для этого нужно нажать комбинацию клавиш WIN+R. Откроется окно «Выполнить». Набрать там в строке «shell: startup» без кавычек, и нажать ENTER. В открывшейся папке разместить программу или ярлык на неё.

Такой командой попадём в папку Автозагрузка

Такой командой попадём в папку Автозагрузка

При загрузке системы программа ищет «родной» COM‑порт, устанавливает с ним связь. Далее узнаёт код текущей раскладки и помещает его первым элементом массива в оперативную память. Если во время работы пользователь переключит раскладку, то код новой раскладки станет вторым элементом массива. Также и с третьим языком раскладки. В дальнейшем в процессе текущего сеанса работы, при переключении пользователем, «знакомая» программе раскладка будет подсвечена (или не подсвечена, если раскладка является основной) красным или зелёным светодиодом.

Если в системе появится ещё одна, четвёртая (и больше) раскладка, то она никак не будет подсвечена и её легко станет спутать с основной раскладкой. Но, повторюсь, не думаю, что большинство людей использует в жизни более чем три раскладки одновременно.

Обратите внимание! Если открываем в операционной системе окно «Настройки языка», то моя обслуживающая индикацию раскладки программа временно перестаёт реагировать до тех пор, пока не закроется окно настроек языка.

Обслуживающая индикацию раскладки программа сидит в трее.

Обслуживающая индикацию раскладки программа сидит в трее.

Обслуживающая программа сидит в трее в виде значка. И при нажатии на значок правой кнопкой мыши появляется меню из двух команд: RESET и EXIT. Команда RESET бывает нужна для перестройки цветов, если после настроек языка хочется сбросить текущие настройки цвета. Ну, а команда EXIT — выгрузка программы из трея.

Меню состоит из двух элементов.

Меню состоит из двух элементов.

Вся «соль» кода программы представлена этим непрерывным потоком, при котором происходит «сканирование» текущей раскладки:

        private static void portTask()
        {
            IntPtr _currentKeyboardLayout = IntPtr.Zero;

            KeyboardLanguageLEDPort klp = new KeyboardLanguageLEDPort();

            while (true)
            {
                if (fReset)
                {
                    fReset = false;
                    klp.ClearLanguages();
                    _currentKeyboardLayout = IntPtr.Zero;
                }
                if (klp.CheckPort() == false)
                {
                    klp.portName = klp.PortFind();
                }
                else
                {
                    try
                    {
                        var newLayout = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero));
                        if (_currentKeyboardLayout != newLayout)
                        {
                            _currentKeyboardLayout = newLayout;
                            klp.AddLanguage(_currentKeyboardLayout.ToInt32());
                            klp.OnLedLanguage(_currentKeyboardLayout.ToInt32());
                        }
                    }
                    catch
                    {

                    }
                }
                System.Threading.Thread.Sleep(100);
            }
        }

Как видим, сканирование производится раз в 100 мс и совсем не нагружает систему:

Программа не загружает систему

Программа не загружает систему

Ниже ссылка на программу индикации раскладки для среды Windows:

© Habrahabr.ru