windowcapture
исходный код / Tip/README_TSF.md

README_TSF.md

71 строк · 6,955 байт · модуль Tip
 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  должен молча грузиться во все приложения. Регистрируй вручную, когда готов проверять.