Semi-transparent always-on-top Windows overlay that shows the keymap of a Vial/QMK split keyboard (Silakka54). - draws all layers from a Vial .vil layout, transparent keys fall through - detects the active layer from the keyboard via a Raw HID command (firmware/) - shows characters of the active Windows input language - can split the two halves into separate, independently movable windows - highlights pressed keys; tray menu for opacity, size and options - Inno Setup installer and portable build; GitHub-style CI workflow
SplitOverlay
Русский · English below
Название репозитория — SplitOverlay. В коде, в имени exe, установщика и в папке настроек приложение называется KeyOverlay.
Полупрозрачный оверлей для Windows, который поверх всех окон показывает раскладку программируемой (Vial / QMK) split-клавиатуры, например Silakka54. Нужен, чтобы учить слои: смотришь на экран и видишь, что где лежит.
Возможности
- Рисует плату по файлу раскладки Vial (
.vil): все слои,MO/TG/LT/mod-tap,Shift+цифраи т.д. - Прозрачные клавиши слоя (
KC_TRNS) показываются приглушённо с нижнего слоя, как в QMK. - Автоопределение слоя с платы (нужна прошивка с командой из
firmware/); без неё слой переключается вручную. - Символы по языку ввода: буквы на клавишах меняются вместе с раскладкой Windows (RU, EN и любая другая). Нужные символы выдаёт сама Windows.
- Разделение половинок: каждая половина отдельным окном, двигаются независимо.
- Подсветка нажатых клавиш, регулировка прозрачности и размера, значок в трее.
- Оверлей прозрачен для мыши и не забирает фокус.
| Слой 1 | Разделение половинок | Язык ввода |
|---|---|---|
![]() |
![]() |
![]() |
Установка
Скачай со страницы Releases установщик KeyOverlay-<версия>-setup.exe
или портативный KeyOverlay-<версия>-portable.zip. Установка идёт без прав администратора.
Exe не подписан, поэтому SmartScreen может предупредить («Подробнее» → «Выполнить в любом случае»).
Раскладку сохрани в Vial: File → Save current layout (.vil). При первом запуске приложение
попросит выбрать этот файл; можно также передать путь аргументом: KeyOverlay.exe "путь\к\раскладке.vil".
Управление
| Действие | Как |
|---|---|
| Следующий / предыдущий слой | Ctrl+Alt+PgDn / Ctrl+Alt+PgUp (отключает автоопределение) |
| Показать / скрыть | Ctrl+Alt+K или двойной клик по значку в трее |
| Прозрачность, размер, слой, язык, разделение, перечитать файл | меню значка в трее |
| Переместить оверлей | трей → «Режим перемещения», тащить мышью, колесо меняет размер |
Прошивка (для автоопределения слоя)
Обычная клавиатура не сообщает ПК, какой слой активен, и в протоколе Vial такой команды нет.
Поэтому в firmware/ лежит небольшое дополнение для QMK/Vial: команда HID 0xE0,
которая возвращает активный слой. Подробности, сборка и инструкция по прошивке: firmware/README.md.
Готовые .uf2 для Silakka54 (LED, v1.4led) лежат в Releases.
Сборка из исходников
Нужен .NET 8 SDK под Windows.
git clone https://gittea.khad1997pav.ru/khadzhibekovpa/SplitOverlay.git
cd SplitOverlay
dotnet test tests/KeyOverlay.Core.Tests
dotnet run --project src/KeyOverlay -- "путь\к\раскладке.vil"
Установщик и портативная сборка (Inno Setup берётся из NuGet, в систему ничего не ставится):
dotnet publish src/KeyOverlay -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true -o dist/app
dotnet restore installer/tools.csproj
installer/packages/tools.innosetup/6.4.3/tools/ISCC.exe /DAppVersion=1.0.0 installer/KeyOverlay.iss
Установщик кладёт в пакет файлы прошивки из firmware/*.uf2: соберите их (см. firmware/README.md)
или скачайте из Releases и положите в firmware/.
Устройство проекта
src/KeyOverlay.Core парсер .vil, подписи кейкодов, геометрия платы, протокол слоя (без зависимости от Windows)
src/KeyOverlay WPF-оверлей: окна, хук клавиатуры, опрос платы по HID, язык ввода, трей
tests/ тесты Core (xUnit)
firmware/ команда слоя для QMK/Vial и сборка прошивки в Docker
installer/ скрипт Inno Setup
Как это работает
Core (src/KeyOverlay.Core, .NET 8, без зависимости от Windows, покрыт тестами):
Keymapчитает.vil(JSON): полеlayout— слои × 10 строк матрицы × 6 колонок. Строки 0–4 — левая половина, 5–9 — правая,-1— клавиши нет. Прозрачные клавиши (KC_TRNS) проваливаются на нижний слой, как в QMK.Keycodesпревращает кейкоды Vial/QMK в подписи (KC_BSPACE→ «Bksp»,LSFT(KC_1)→ «!»,MO(2)→ «MO 2»).BoardGeometry— положение клавиш Silakka54: 4×6 с шагом по колонкам и 3 больших пальца на половину.ScanCodesиPressedKeys— разбор скан-кодов (физическая клавиша не зависит от языка) и учёт нажатых.LayerProtocol— формат команды слоя для прошивки;KeyLocalizer— замена подписей по языку ввода.
Приложение (src/KeyOverlay, WPF):
- Окно прозрачное, без рамки, поверх всех окон; стили
WS_EX_TRANSPARENT | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOWделают его прозрачным для мыши, без фокуса и без значка в панели задач. KeyboardHook— глобальный low-level hook: подсветка нажатых клавиш и горячие клавиши. События всегда передаются дальше.LayerPoller— раз в ~80 мс спрашивает плату по Raw HID (usage page0xFF60, usage0x61, библиотека HidSharp), реконнект при отключении.InputLanguage— язык берётся у окна на переднем плане (GetKeyboardLayout), символы клавиш вычисляет Windows (ToUnicodeEx).OverlayControllerсвязывает окна, хук, опрос платы, трей и настройки; режим разделения создаёт второе окно для правой половины.
Поддерживаемые кейкоды
| Что | Примеры |
|---|---|
| Буквы, цифры, знаки, F1–F24 | KC_A, KC_1, KC_SCOLON, KC_F12 |
| Навигация и служебные | KC_ENTER, KC_BSPACE, KC_DELETE, стрелки, KC_PGUP, KC_HOME, KC_PSCREEN |
| Модификаторы | KC_LSHIFT, KC_RCTRL, KC_LALT, KC_LGUI |
| Медиа | KC_MPLY, KC_VOLU, KC_BRIU |
| Обёртки с модификаторами | LSFT(KC_1), LCTL(KC_C) (а также S, C, A, G, правые варианты) |
| Слои | MO(n), TG(n), TO(n), TT(n), OSL(n), DF(n), LT(n, kc) |
| Mod-tap | LCTL_T(kc), MT(MOD_LSFT, kc) |
| Прозрачная / пустая | KC_TRNS, KC_NO |
Всё остальное (макросы, tap dance, QK_BOOT и т.п.) показывается сокращённым именем кейкода без расшифровки.
Сейчас геометрия рассчитана на Silakka54 (матрица 10×6, 54 клавиши); для других плат нужна своя геометрия.
Настройки
Файл %APPDATA%\KeyOverlay\settings.json создаётся автоматически и меняется через меню трея.
| Поле | Значение |
|---|---|
VilPath |
путь к файлу раскладки .vil |
Opacity |
прозрачность 0.2–1.0 |
Scale |
размер 0.5–2.0 |
Left, Top |
позиция окна (левой половины в режиме разделения) |
RightLeft, RightTop |
позиция правой половины в режиме разделения |
Layer |
последний выбранный вручную слой |
AutoLayer |
определять слой по данным платы |
HighlightPressed |
подсвечивать нажатые клавиши |
LocalizeKeys |
показывать символы выбранного языка ввода |
SplitHalves |
показывать половинки отдельными окнами |
Чтобы сбросить настройки, закрой приложение и удали этот файл.
Если что-то не работает
- В подписи «плата не отвечает». Авто-определение слоя работает только с прошивкой из
firmware/. Проверь, что прошиты обе половины, кабель подключён к главной (для файла LEFT — левой), а Vial закрыт. Пока слой можно выбрать вручную (Ctrl+Alt+PgUp/PgDn). - Оверлея не видно. Нажми Ctrl+Alt+K или двойной клик по значку в трее. Если окно осталось за пределами экрана, удали
settings.json. - SmartScreen / антивирус ругается. Exe не подписан, а приложение использует глобальный перехват клавиш (нужен для подсветки). Исходники открыты, собрать можно самому.
- Поверх игры оверлея нет. Окно показывается поверх оконных и borderless-приложений, но не поверх эксклюзивного полноэкранного режима.
- Буквы не меняются при смене языка. Проверь пункт «Символы по языку ввода» в меню трея. Язык берётся у окна, в которое ты печатаешь.
Идеи и планы
- Геометрия других плат (описание в JSON), имена слоёв.
- Подпись exe и автообновление.
- Автоматическое отслеживание изменений файла
.vil.
Участие
Issues и pull request приветствуются. Перед отправкой запусти dotnet test tests/KeyOverlay.Core.Tests; CI делает то же самое и собирает приложение.
Приватность
Перехват клавиш (low-level hook) нужен только для подсветки нажатых клавиш и горячих клавиш.
Нажатия нигде не сохраняются и не отправляются, события всегда передаются дальше без изменений.
Приложение ничего не отправляет в сеть. Настройки лежат в %APPDATA%\KeyOverlay\settings.json.
Ограничения
- Только Windows (WPF), x64.
- Определение слоя с платы работает через Raw HID и требует прошивки с командой
0xE0; половина, подключённая к ПК, должна быть главной. - Caps Lock на подписях не отражается; мёртвые клавиши показываются знаком акцента.
- Vial GUI и оверлей не стоит держать открытыми одновременно: оба общаются с одним HID-интерфейсом.
Лицензия
Приложение: MIT. Дополнение для прошивки (firmware/keyoverlay_hid.c) собирается внутрь
QMK/Vial и распространяется под GPL-2.0-or-later. Исходники плат и Vial принадлежат их авторам:
vial-qmk, Squalius-cephalus/silakka54.
English
KeyOverlay is a semi-transparent, click-through Windows overlay that shows the keymap of a programmable (Vial / QMK) split keyboard such as the Silakka54, always on top, to help you learn your layers.
Features: draws the board from a Vial .vil layout (all layers, MO/TG/LT/mod-tap, transparent keys
falling through to lower layers); detects the active layer from the keyboard via a small QMK/Vial firmware
command (firmware/); shows the characters of the active Windows input language; can split the two halves
into separate windows; highlights pressed keys; tray icon with opacity/size options.
Install: download the setup or portable zip from Releases; save your layout in Vial via
File → Save current layout and pick that .vil on first run. Build: .NET 8 SDK, dotnet test tests/KeyOverlay.Core.Tests,
dotnet run --project src/KeyOverlay. Windows only (x64). Key hook is used only for highlighting and hotkeys; nothing is stored or sent.
License: MIT for the app; the firmware add-on is GPL-2.0-or-later (it is compiled into QMK/Vial).



