盒子
盒子

让小狼毫输入法在 Win10 仅显示一种输入模式

小狼毫(rime)输入法在Windows 10 下会同时显示ime以及tsf两种输入模式。在我的机器上,大多数情况下这两种输入模式都运行正常;一小部分App中,ime无法正常输入,但是tsf模式工作正常。于是想去掉对我业已无用的ime输入模式。否则动辄显示两个输入法,切换起码非常麻烦。但是,无论是通过查找设置文件,还是在贴吧中寻找帮助都未果。

最后通过查询weasel项目中的imesetup.cpp的源代码,发现以下函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// 注册IME输入法
int register_ime(const wpath& ime_path, bool register_ime, bool is_wow64, bool hant, bool silent)
{
if (is_wow64)
{
return 0; // only once
}
const WCHAR KEYBOARD_LAYOUTS_KEY[] = L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts";
const WCHAR PRELOAD_KEY[] = L"Keyboard Layout\\Preload";
if (register_ime)
{
HKL hKL = ImmInstallIME(ime_path.wstring().c_str(), WEASEL_IME_NAME);
if (!hKL)
{
// manually register ime
WCHAR hkl_str[16] = {0};
HKEY hKey;
LSTATUS ret = RegOpenKey(HKEY_LOCAL_MACHINE, KEYBOARD_LAYOUTS_KEY, &hKey);
if (ret == ERROR_SUCCESS)
{
for (DWORD k = 0xE0200000 + (hant ? 0x0404 : 0x0804); true; k += 0x10000)
{
wsprintf(hkl_str, L"%08X", k);
HKEY hSubKey;
ret = RegOpenKey(hKey, hkl_str, &hSubKey);
if (ret == ERROR_SUCCESS)
{
WCHAR imeFile[32] = {0};
DWORD len = sizeof(imeFile);
DWORD type = 0;
ret = RegQueryValueEx(hSubKey, L"Ime File", NULL, &type, (LPBYTE)imeFile, &len);
RegCloseKey(hSubKey);
if (_wcsicmp(imeFile, L"weasel.ime") == 0)
{
hKL = (HKL)k; // already there
}
}
else
{
// found a spare number to register
ret = RegCreateKey(hKey, hkl_str, &hSubKey);
if (ret == ERROR_SUCCESS)
{
const WCHAR ime_file[] = L"weasel.ime";
RegSetValueEx(hSubKey, L"Ime File", 0, REG_SZ, (LPBYTE)ime_file, sizeof(ime_file));
const WCHAR layout_file[] = L"kbdus.dll";
RegSetValueEx(hSubKey, L"Layout File", 0, REG_SZ, (LPBYTE)layout_file, sizeof(layout_file));
const WCHAR layout_text[] = WEASEL_IME_NAME;
RegSetValueEx(hSubKey, L"Layout Text", 0, REG_SZ, (LPBYTE)layout_text, sizeof(layout_text));
RegCloseKey(hSubKey);
hKL = (HKL)k;
}
break;
}
}
RegCloseKey(hKey);
}

于是通过注册表程序搜索weasel.ime,删除对应键值,问题解决。