Мой блог
Разработка собственного переключателя раскладки клавиатуры на Delphi
Автоматическое переключение языков ввода в операционной системе Windows нередко сталкивается с ложными срабатываниями, сильной задержкой ввода или нежелательным вмешательством в консольные команды и программный код. Попытки найти универсальное решение среди классического и стороннего ПО нередко упираются в закрытый код, избыточный функционал или сетевую активность. Именно поэтому разработка собственного переключателя раскладки клавиатуры на Delphi с открытым исходным кодом становится практичной альтернативой для разработчиков и инженеров.









Проект утилиты развивался на протяжении нескольких лет проб и ошибок. Лобовой поиск по массивным словарям вроде словаря Зализняка оказался непрактичным на этапе загрузки, а чистый частотный анализ без жестких фильтров приводил к огромному количеству ложных срабатываний на коротких словах и служебных токенах вроде идентификаторов в коде. Нейросетевые модели и ML-классификаторы также были отброшены, поскольку они избыточны по ресурсам и не укладываются в жесткие временные рамки отклика низкоуровневых системных хуков.
Архитектура и разделение потоков
Чтобы обеспечить стабильность работы всей системы, архитектура утилиты разбита на четыре автономных функциональных слоя. Блок перехвата и железа фиксирует физические скан-коды и модификаторы, интеллектуальный конвейер оценивает текст, диспетчер управляет очередью задач, а интерфейсный модуль отвечает за системный трей и визуальные подсказки.
Главное правило операционной системы для низкоуровневого перехватчика заключается в строгом ограничении времени выполнения. Если процедура хука задерживает управление более чем на пару десятков миллисекунд, операционная система считает элемент зависшим и удаляет его из цепочки обработки. Во избежание этого логика разделена на два изолированных контура:
- Главный поток: обрабатывает стандартные сообщения, ловит скан-коды, отслеживает двойные нажатия клавиши Shift, накапливает символы в буфере и на границах слов выполняет эвристический анализ.
- Рабочий поток: фоновый поток, который активируется по системному сигналу и выполняет потенциально блокирующие операции, такие как обращение к буферу обмена или сохранение настроек на диск.
Физическая модель ввода и конвейер анализа
Программа не опирается на уязвимые программные запросы к активному окну, а преобразует символы на основе физической раскладки клавиатуры. Специальная таблица связывает аппаратные клавиши латиницы и кириллицы с точным сохранением регистра. Анализ текста запускается строго на границах слов, которыми выступают пробелы, знаки табуляции или нажатия клавиши Enter.
Шестиступенчатый конвейер принятия решений последовательно проверяет каждый токен по строгим правилам:
- Проверка черного списка для слов, где пользователь ранее отменял автоматическое исправление.
- Защита специализированных токенов, включая веб-ссылки, пути файловой системы, адреса электронной почты, переменные кода и аббревиатуры.
- Принудительное обучение для комбинаций, переключенных пользователем вручную.
- Обработка коротких служебных форм по прямой таблице соответствий.
- Исключение одиночных символов короче двух знаков.
- Математический скоринг n-грамм и языковых эвристик.
Математический скоринг и языковые маркеры
Для определения языковой принадлежности незнакомых терминов применяется разбиение слов на буквенные цепочки. Скользящее окно подсчитывает совпадения биграмм и триграмм с заранее подготовленными таблицами частых слогов. Дополнительно учитывается присутствие гласных букв, наличие характерных цифробуквенных комбинаций и контекст пяти предшествующих слов в текущем окне ввода.
Порог срабатывания алгоритма зависит от выбранного профиля чувствительности. В стандартном режиме защитный порог сбалансирован так, чтобы минимизировать ложные срабатывания, в осторожном режиме программа вмещается только при очевидных совпадениях, а в агрессивном режиме переключение происходит быстрее при минимальном перевесе баллов.
Безопасность, исполнение и сборка
Для предотвращения мерцания экрана при исправлении текста используется пакетная отправка команд через системный вызов SendInput. Специальные сигнатуры в поле дополнительных данных и временное снятие хука исключают бесконечную рекурсию и залипание модификаторов. Поля ввода паролей защищены через проверки стандартных флагов интерфейса и интерфейсы автоматизации, блокирующие накопление символов в секретных зонах.
Готовые скомпилированные бинарники стороннего происхождения часто несут потенциальные риски безопасности при работе с клавиатурным вводом, поэтому проект рассчитан на самостоятельную компиляцию из исходного кода. Для сборки используется среда Embarcadero Delphi с целевой платформой Win64 без привлечения внешних библиотек и сторонних компонентов.
