# mouse-input-type **Repository Path**: swpper/mouse-input-type ## Basic Information - **Project Name**: mouse-input-type - **Description**: 激活输入状态时显示中英文输入状态 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-24 - **Last Updated**: 2026-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MouseInputType — 输入法中英文状态指示器 Windows 系统托盘小工具。鼠标左键点击文本输入区域时,在光标旁边短暂显示"中"/"英"提示,让你在打字前就能看到当前输入法的中英文状态。 ## 行为 - **触发条件**:鼠标左键点击文本输入区域时(通过 `WH_MOUSE_LL` 底层钩子捕获) - **输入区域检测**:① IBeam(工字形)鼠标光标句柄比较 ② 已知非文本光标排除 ③ 窗口类名匹配(自定义光标回退) - **显示位置**:初始在鼠标点击位置旁边,显示期间跟随系统文本光标(`rcCaret`) - **显示时长**:约 3 秒后自动消失(Shift 按下时重置计时) - **实时更新**:显示期间每 100ms 轮询 IME 状态,支持 Shift / Ctrl+Space 等所有切换方式 - **光标跟随**:显示期间浮窗跟随系统文本光标位置移动(经典 Win32 应用) ## 支持的输入法 | 输入法 | 兼容性 | |--------|--------| | 微软拼音 (Windows 自带) | 完全支持 | | 搜狗拼音 | 支持(IME_CMODE_NATIVE 标准接口) | | QQ 拼音 | 支持(同上) | | 手心输入法 | 支持(同上) | | 其他标准 IME | 通过 imm32.dll 标准接口,理论上兼容 | ## 支持的应用 通过 IBeam 光标检测,理论上支持**所有**在文本输入区域显示工字形光标的应用,包括但不限于: | 应用类型 | 说明 | |----------|------| | 经典 Win32 应用(记事本、Word 等) | 系统光标检测 + 光标跟随 | | Chrome / Edge / Firefox | IBeam 光标检测 | | VS Code / Electron 应用 | IBeam 光标检测 | | Windows Terminal / 控制台 | IBeam 光标检测 | | 任何显示工字形光标的应用 | IBeam 光标检测 | ## 构建 ### 环境要求 - [.NET 8 SDK](https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0) - Windows 10 / 11 ### 命令 ```bash cd src/MouseInputType dotnet restore dotnet build -c Release ``` 产物:`src/MouseInputType/bin/Release/net8.0-windows/MouseInputType.exe` ### 运行 ```bash cd src/MouseInputType dotnet run -c Release ``` 或直接双击 `MouseInputType.exe`。程序启动后出现在系统托盘(右下角图标区),无窗口。右键托盘图标选择 **Exit** 退出。 ## 项目结构 ``` src/MouseInputType/ Program.cs # 入口,STAThread,DPI 初始化 NativeMethods.cs # P/Invoke 声明(imm32.dll / user32.dll)+ 鼠标钩子 + 光标检测 API ImeDetector.cs # IME 中英文状态读取 IndicatorForm.cs # 浮窗(无边框、可穿透、鼠标钩子、实时更新、光标跟随) TrayApplicationContext.cs # 系统托盘生命周期 ``` ## 技术要点 | 机制 | 说明 | |------|------| | 点击触发 | `SetWindowsHookEx(WH_MOUSE_LL)` 底层鼠标钩子捕获每次左键点击 | | IME 状态检测 | TSF 全局 Compartment 优先,IMM32 回退 — `IME_CMODE_NATIVE` 位 = 中文模式 | | 输入区域检测 | ① IBeam 光标句柄比较(预加载) ② 已知非文本光标排除 ③ 窗口类名匹配 | | 光标定位 | 初始 `Cursor.Position` + 偏移;显示期间 `rcCaret.Right/Bottom` 跟随 | | 实时更新 | 显示期间每 100ms 轮询 IME 状态 + 跟随光标 | | 浮窗不抢焦点 | `WS_EX_NOACTIVATE` + `WS_EX_TRANSPARENT`(鼠标穿透) | | 浮窗不在 Alt+Tab | `WS_EX_TOOLWINDOW` | | 不遮挡右键菜单 | `FindWindow("#32768")` 系统级弹窗检测 | | 不在任务栏显示 | `WindowFromPoint` → `Shell_TrayWnd` 检测 | | 多显示器 / 高 DPI | `PerMonitorV2` DPI 模式 + 每屏边缘裁剪 | | 性能优化 | 光标句柄预加载(避免 `LoadCursor` 重复调用) | ## 已知限制 - 现代应用(Chrome、VS Code)不暴露系统光标,浮窗定位回退到鼠标位置且无法跟随文本光标 - 部分应用可能使用自定义光标而非系统 IBeam,此时依赖窗口类名回退检测 - 仅支持中/英两种状态显示,不支持日文/韩文等其他语言