1# WCTip — TSF Text Input Processor (универсальная in-place автозамена) 2 3Нативный COM-компонент (Text Services Framework TIP), который правит текст **на месте в любом 4TSF-приложении** — так же, как системная автозамена / IME, **без буфера обмена и без смены фокуса**. 5Это «вариант 2» из [../TSF_AND_TINY_NN_DESIGN.md](../TSF_AND_TINY_NN_DESIGN.md). 6 7## Статус 8- **Milestone 1 (готово, собирается, self-test проходит):** механизм доказан. На границе слова 9 (пробел/Enter) TIP читает только что набранное слово прямо из буфера документа (`ITfRange`) и, если 10 это известная опечатка, заменяет **ровно этот диапазон** внутри edit-session. «Мозг» здесь — крошечная 11 встроенная таблица опечаток (`Correct.h`), чтобы изолированно проверить саму TSF-механику. 12- **Milestone 2 (готово, собирается):** TIP больше не ограничен встроенной таблицей. На границе слова он 13 POST-ит «слово\nлевый_контекст» в C#-приложение (`Helpers/TipBridge.cs`, localhost TCP **:8766**, 14 `POST /correctword`) через **WinHTTP** и применяет ответ **настоящего мозга** 15 (`TextProcessor.CorrectWordForTip`: RulesEngine/forcedFix + noisy-channel `CompactSpell` + 16 rubert-tiny2 rescore + precision-gate). Если мост недоступен — **откат на встроенную таблицу** 17 (короткие таймауты, набор не подвисает). Включается тумблером в трее «TSF-мост для in-place правки 18 (эксп.)» (флаг `Settings.TsfBridge`, по умолч. выкл). C#-round-trip моста проверен headless 19 (`Tools/TestTipBridge.cs`): **5/5** — ответ моста == прямому вызову, `превет`→`Привет` реально 20 исправляется через мост (тот же HTTP-протокол использует C++ TIP). 21- **Не протестировано вживую** (нужен GUI/живое TSF-приложение; computer-use отключён). Собирается: 22 C# `BUILD EXIT=0`, TIP `EXIT=0`, headless self-test **12/12**. 23 24## Требования 25- Visual Studio Build Tools 2022 с компонентом **VC++ x64** + **Windows SDK** (есть на машине; проверено). 26 27## Сборка 28```powershell 29powershell -File build_tip.ps1 # -> bin\WCTip.dll 30``` 31 32## Self-test (без регистрации в системе) 33Проверяет таблицу правок (кодировку) и весь COM-цикл DLL (class factory, создание объекта, QueryInterface, 34баланс ref-count) — НЕ загружая TIP в системный ввод: 35```powershell 36cmd /c 'call "C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat" x64 && cl /nologo /EHsc /utf-8 /DUNICODE /D_UNICODE /Fe:Tip\_selftest.exe /Fo:Tip\_selftest.obj Tip\_selftest.cpp /link ole32.lib uuid.lib && Tip\_selftest.exe' 37``` 38Ожидается `SELFTEST_OK` (12/12). 39 40## Регистрация и проверка вживую ⚠️ 41Регистрация **per-user (HKCU), без админа**. После неё TIP появляется как русский метод ввода 42«WindowCapture Autocorrect» и **грузится во все TSF-приложения** — включай только когда готов тестировать. 43```powershell 44regsvr32 bin\WCTip.dll # зарегистрировать 45# Win+Space -> выбрать "WindowCapture Autocorrect" (под русской раскладкой) 46# В Notepad/WordPad/браузере набери: превет<пробел> -> станет привет 47regsvr32 /u bin\WCTip.dll # снять регистрацию (полностью убрать) 48``` 49Тест-слова M1 (встроенная таблица, без моста): `превет`/`пливет`→привет, `здраствуй`→здравствуй, 50`карова`→корова, `сабака`→собака, `малако`→молоко, `симпотичный`→симпатичный, `тестовае`→тестовое. 51 52**Чтобы работал настоящий мозг (M2), а не таблица:** запусти `MediaCore.exe` (ПКМ по иконке → модуль «Автозамена» включён), в трее 53включи **«TSF-мост для in-place правки (эксп.)»** (поднимет localhost :8766). Тогда TIP в любом приложении 54будет слать набранное слово в общий мозг (CompactSpell + rubert-tiny2 + гейт) и заменять на месте. 55Без запущенного приложения/моста TIP откатывается на встроенную таблицу. 56 57## Архитектура (M1) 581. `ITfTextInputProcessorEx::ActivateEx` → подписка на `ITfKeyEventSink` (`AdviseKeyEventSink`). 592. `OnKeyDown` для `VK_SPACE`/`VK_RETURN`: клавишу **не съедаем** (граница печатается нормально), 60 запрашиваем async R/W edit-session на текущем `ITfContext`. 613. `CEditSession::DoEditSession(ec)`: берём выделение (каретку), клонируем range, `ShiftStart(-64)`, 62 `GetText` → находим последнее слово (пропустив хвостовые разделители), `wctip::CorrectWord`. 634. Если есть правка — клон range, `ShiftStart/ShiftEnd` на границы слова, `SetText` — **замена на месте**. 64 65Без буфера обмена, без смены фокуса/поля/приложения, с корректным undo приложения. 66 67## Замечания 68- Работает в TSF-aware приложениях (совр. Win32/WPF/UWP/Chromium). Чистый старый Win32 EDIT без TSF — нет. 69- Профиль регистрируется под русский (LANGID 0x0419). GUID'ы CLSID/профиля — фиксированные константы в коде. 70- TIP **намеренно не регистрируется автоматически** сборкой: непротестированный системный компонент не 71 должен молча грузиться во все приложения. Регистрируй вручную, когда готов проверять.