fcitx-remote-for-windows icon indicating copy to clipboard operation
fcitx-remote-for-windows copied to clipboard

3种语言的切换

Open perfectkaki opened this issue 1 year ago • 1 comments

这个有没有可能扩展到3种语言的切换。

例如实现目标:

  1. 使用英文, 中文,日语输入法。(切换时候的排序为 英,中,日)
  2. 输入命令时候, 全部切换至英文
  3. 命令输入完毕后,切换回来的输入法。

在原有的代码下,我进行了尝试, 一句一句的查代码的意思,憋了2周,只实现到了第二步。能不能指点下(=-=) 下面是我尝试的代码(把里面的一个叫fcitx-remote.cpp的文件修改了)。

#include "stdafx.h" #include <windows.h> #include #pragma comment(lib, "user32.lib") #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; }

perfectkaki avatar Sep 03 '23 08:09 perfectkaki

就目前的框架来说, 你这个需求很难实现, 分析如下:

  • 上层的 fcitx.el 在调用 fcitx-remote.exe 的时候, 仅仅通过命令行参数 "-o" & "-c" 来告诉本程序分别执行: "打开非英文输入法" & "关闭非英文输入法(即切换到英文输入法)", 在有多个非英文输入法的情况下, 你不知道 fcitx.el 想让你切换到哪一个非英文输入法;
  • 如果你想实现第三个功能, 在不更改 fcitx.el 的情况下, 你只能自己保存一个变量 prev_non_english, 它记录上一次切换到英文之前的输入法是中文还是日文, 然后再次切换到非英文输入法的时候, 去读取这个变量, 再切换回指定的非英文输入法. 但这个方法也有其他的问题: 用什么来记录这个变量? 如果是文件系统, 可能会增加延迟. 也许 windows 还有其他高效的的存储临时变量的方式, 需要自己研究一下;
  • 也许就直接的方法就是修改 fcitx.el , 让他来记录 prev_non_english, 然后在切换的时候, 直接通过命令行参数告诉本程序应该切换到哪一个输入法;

Tyushang avatar Nov 24 '23 09:11 Tyushang