Загрузка 0
ПОДЕЛИТЬСЯ

Мой блог

Листай вниз

Разработка собственного переключателя раскладки клавиатуры на Delphi

Разработка собственного переключателя раскладки клавиатуры на Delphi

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

Значок текущей раскладки в системном трее
Значок программы в системном трее с текущей индикацией языка
Плавающий индикатор раскладки возле каретки ввода
Анимированная плашка смены языковой раскладки возле курсора
Разработка собственного переключателя раскладки клавиатуры на Delphi
Разработка собственного переключателя раскладки клавиатуры на Delphi — изображение 5
Разработка собственного переключателя раскладки клавиатуры на Delphi — изображение 6
Разработка собственного переключателя раскладки клавиатуры на Delphi — изображение 7
Разработка собственного переключателя раскладки клавиатуры на Delphi — изображение 8
Разработка собственного переключателя раскладки клавиатуры на Delphi — изображение 9
Разработка собственного переключателя раскладки клавиатуры на Delphi — изображение 10

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

Архитектура и разделение потоков

Чтобы обеспечить стабильность работы всей системы, архитектура утилиты разбита на четыре автономных функциональных слоя. Блок перехвата и железа фиксирует физические скан-коды и модификаторы, интеллектуальный конвейер оценивает текст, диспетчер управляет очередью задач, а интерфейсный модуль отвечает за системный трей и визуальные подсказки.

Реклама

Главное правило операционной системы для низкоуровневого перехватчика заключается в строгом ограничении времени выполнения. Если процедура хука задерживает управление более чем на пару десятков миллисекунд, операционная система считает элемент зависшим и удаляет его из цепочки обработки. Во избежание этого логика разделена на два изолированных контура:

  • Главный поток: обрабатывает стандартные сообщения, ловит скан-коды, отслеживает двойные нажатия клавиши Shift, накапливает символы в буфере и на границах слов выполняет эвристический анализ.
  • Рабочий поток: фоновый поток, который активируется по системному сигналу и выполняет потенциально блокирующие операции, такие как обращение к буферу обмена или сохранение настроек на диск.

Физическая модель ввода и конвейер анализа

Программа не опирается на уязвимые программные запросы к активному окну, а преобразует символы на основе физической раскладки клавиатуры. Специальная таблица связывает аппаратные клавиши латиницы и кириллицы с точным сохранением регистра. Анализ текста запускается строго на границах слов, которыми выступают пробелы, знаки табуляции или нажатия клавиши Enter.

Шестиступенчатый конвейер принятия решений последовательно проверяет каждый токен по строгим правилам:

  1. Проверка черного списка для слов, где пользователь ранее отменял автоматическое исправление.
  2. Защита специализированных токенов, включая веб-ссылки, пути файловой системы, адреса электронной почты, переменные кода и аббревиатуры.
  3. Принудительное обучение для комбинаций, переключенных пользователем вручную.
  4. Обработка коротких служебных форм по прямой таблице соответствий.
  5. Исключение одиночных символов короче двух знаков.
  6. Математический скоринг n-грамм и языковых эвристик.
  7. Математический скоринг и языковые маркеры

    Для определения языковой принадлежности незнакомых терминов применяется разбиение слов на буквенные цепочки. Скользящее окно подсчитывает совпадения биграмм и триграмм с заранее подготовленными таблицами частых слогов. Дополнительно учитывается присутствие гласных букв, наличие характерных цифробуквенных комбинаций и контекст пяти предшествующих слов в текущем окне ввода.

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

    Безопасность, исполнение и сборка

    Для предотвращения мерцания экрана при исправлении текста используется пакетная отправка команд через системный вызов SendInput. Специальные сигнатуры в поле дополнительных данных и временное снятие хука исключают бесконечную рекурсию и залипание модификаторов. Поля ввода паролей защищены через проверки стандартных флагов интерфейса и интерфейсы автоматизации, блокирующие накопление символов в секретных зонах.

    Готовые скомпилированные бинарники стороннего происхождения часто несут потенциальные риски безопасности при работе с клавиатурным вводом, поэтому проект рассчитан на самостоятельную компиляцию из исходного кода. Для сборки используется среда Embarcadero Delphi с целевой платформой Win64 без привлечения внешних библиотек и сторонних компонентов.

01.