另一个 Windows 上的 im-select 实现。
相对于 im-select 的优势 :
- 支持几乎所有类型的窗口,包括控制台窗口和 UWP 窗口。
- 允许通过输入法(即 TIP,文本输入处理器)的 GUID 切换输入法,而
im-select只能切换语言。 - 允许设置输入法的区段(compartments),包括:
- 开关状态(例如中文输入法的中文/英文模式或日语输入法的假名/英文模式)。
- 转换模式(例如英文/本地模式)。
- 从 GUI 运行时,不会出现控制台窗口。
- 其他功能,包括条件切换等。
im-select 使用 ActivateKeyboardLayout 来切换键盘布局(语言),但这对某些类型的窗口不起作用,如控制台窗口和 UWP 窗口。
在现代 Windows 上,输入法由文本服务框架(TSF)管理。每个输入法由一个文本输入处理器(TIP)表示,并由一个全局唯一标识符(GUID)标识。可以使用 ITfInputProcessorProfileMgr::ActivateProfile 方法更改活动 TIP,该方法适用于几乎所有类型的窗口。
然而,TSF 要求调用者与前台窗口在同一线程中。为了有效地调用 TSF API,im-control 使用 SetWindowsHookEx 将 DLL 中的窗口过程注入前台窗口,然后向被注入的窗口发送一个自定义的窗口消息以调用 TSF 的 API。其他参数则通过共享内存传递给目标窗口。
使用这种方法,im-control 可以在目标窗口上调用所有 TSF API,例如用于设置区段的 ITfCompartment::SetValue。
请确保你已经安装了 CMake 和 Visual Studio。
cmake -S . -B build -G "Visual Studio 17 2022"
cmake --build build --config RelWithDebInfo
# 将输出的二进制文件放在 `bin` 目录下
cmake --install build --prefix bin --config RelWithDebInfoim-control [LANGID-{GUID}] [-k|--keyboard <open|close>] [-c|--conversion-mode <alphamumeric|native[,...]>] [-o FILE]
im-control -l|--list
im-control -v|--version
在运行前,请确保以下文件在同一目录下:
im-control.exeim-control-injector-32.dllim-control-injector-64.dllim-control-hook-32.dllim-control-hook-64.dll
# 英语(美国)
im-control 0409-{00000000-0000-0000-0000-000000000000}
# 中文(简体,中国)- 微软拼音
im-control 0804-{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}
# 小狼毫
im-control 0804-{A3F4CDED-B1E9-41EE-9CA6-7B4D0DE6CB0A}输出为之前输入法的 LANGID-{GUID}。
im-control -k open
im-control -k close# 切换到小狼毫并开启中文输入模式
im-control 0804-{A3F4CDED-B1E9-41EE-9CA6-7B4D0DE6CB0A} -k open# 如果当前输入法是英语键盘,则切换到微软拼音,否则切换到小狼毫
im-control 0804-{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E} --if 0409-{00000000-0000-0000-0000-000000000000} --else 0804-{A3F4CDED-B1E9-41EE-9CA6-7B4D0DE6CB0A}im-control -lim-control- 实现
-l|--list参数以列出所有输入法。
- 编译为 Win32 GUI 应用以避免弹出控制台窗口,但从命令行运行时仍支持附到控制台。
- 使用 Event 代替等待进程退出以减少等待时间。
- 增加
-o|--output FILE参数以将输出写入文件。 - 增加
--if和--else参数以支持条件切换。 - 将 GUID 输出格式统一为大写字母。
- 重构并改进注入器代码。
- 改进日志记录。
- 其他 bug 修复。
- 改变命令行语法以更兼容现有工具。
- 实现获取当前输入法功能。
- 增加
-version--version参数以显示版本信息。
第一个版本。