fcitx-remote-for-windows
fcitx-remote-for-windows copied to clipboard
3种语言的切换
这个有没有可能扩展到3种语言的切换。
例如实现目标:
- 使用英文, 中文,日语输入法。(切换时候的排序为 英,中,日)
- 输入命令时候, 全部切换至英文
- 命令输入完毕后,切换回来的输入法。
在原有的代码下,我进行了尝试, 一句一句的查代码的意思,憋了2周,只实现到了第二步。能不能指点下(=-=) 下面是我尝试的代码(把里面的一个叫fcitx-remote.cpp的文件修改了)。
#include "stdafx.h"
#include <windows.h>
#include
using namespace std;
BOOL toggleInputMethod() { INPUT ips[4]; memset(ips, 0, sizeof(ips)); for (int i = 0; i < 4; i++) { ips[i].type = INPUT_KEYBOARD; } // uncomment if use win+space //ips[0].ki.wVk = ips[2].ki.wVk = VK_LWIN; //ips[1].ki.wVk = ips[3].ki.wVk = VK_SPACE; ips[0].ki.wVk = ips[2].ki.wVk = VK_MENU; ips[1].ki.wVk = ips[3].ki.wVk = VK_SHIFT; ips[2].ki.dwFlags = ips[3].ki.dwFlags = KEYEVENTF_KEYUP; SendInput(4, ips, sizeof(INPUT)); return 0; }
static int layout_num = 0;
int _tmain(int argc, _TCHAR* argv[])
{
HKL currentLayout = GetKeyboardLayout(0);
if (argc > 1)
{
if (!_tcscmp(argv[1], _T("-c")))
{
//english layout
if (currentLayout == LoadKeyboardLayout((LPCWSTR)L"00000409", KLF_ACTIVATE))
{
layout_num = 0;
}
//Cn layout
else if (currentLayout == LoadKeyboardLayout((LPCWSTR)L"00000804", KLF_ACTIVATE))
{
toggleInputMethod();
toggleInputMethod();
layout_num = 1;
}
//Jp layout
else if (currentLayout == LoadKeyboardLayout((LPCWSTR)L"00000411", KLF_ACTIVATE))
{
toggleInputMethod();
layout_num = 2;
}
else
{
// printf ("unknown\n");
}
}
else if (!_tccmp(argv[1], _T("-o")))
{
if (layout_num == 0)
{
}
else if (layout_num == 1)
{
toggleInputMethod();
}
else if (layout_num == 2)
{
toggleInputMethod();
toggleInputMethod();
}
}
}
else
{
cout << (2 - (currentLayout == LoadKeyboardLayout((LPCWSTR)L"00000409", KLF_ACTIVATE))) << endl;
}
return 0;
}
就目前的框架来说, 你这个需求很难实现, 分析如下:
- 上层的 fcitx.el 在调用 fcitx-remote.exe 的时候, 仅仅通过命令行参数 "-o" & "-c" 来告诉本程序分别执行: "打开非英文输入法" & "关闭非英文输入法(即切换到英文输入法)", 在有多个非英文输入法的情况下, 你不知道 fcitx.el 想让你切换到哪一个非英文输入法;
- 如果你想实现第三个功能, 在不更改 fcitx.el 的情况下, 你只能自己保存一个变量 prev_non_english, 它记录上一次切换到英文之前的输入法是中文还是日文, 然后再次切换到非英文输入法的时候, 去读取这个变量, 再切换回指定的非英文输入法. 但这个方法也有其他的问题: 用什么来记录这个变量? 如果是文件系统, 可能会增加延迟. 也许 windows 还有其他高效的的存储临时变量的方式, 需要自己研究一下;
- 也许就直接的方法就是修改 fcitx.el , 让他来记录 prev_non_english, 然后在切换的时候, 直接通过命令行参数告诉本程序应该切换到哪一个输入法;