C# 切換輸入法

查看已安裝的語言:
    
InputLanguageCollection installedInputLanguages = InputLanguage.InstalledInputLanguages;
foreach (InputLanguage inputLang in installedInputLanguages)
{
    Console.WriteLine($"語言文化 (Culture): {inputLang.Culture.EnglishName} - {inputLang.Culture.Name}");
    Console.WriteLine($"鍵盤佈局 (Layout): {inputLang.LayoutName}");
    Console.WriteLine($"語言識別碼 10 進位顯示: {inputLang.Handle.ToInt32()}");
    Console.WriteLine($"語言識別碼 16 進位顯示: 0x{inputLang.Handle.ToInt32().ToString("X")}");
    Console.WriteLine("---------------------------------------");
}
    

範例輸出:
    
語言文化 (Culture): Chinese (Taiwan) - zh-TW
鍵盤佈局 (Layout): 中文 (繁體) - 美式鍵盤
語言識別碼 10 進位顯示: 67372036
語言識別碼 16 進位顯示: 0x4040404
---------------------------------------
語言文化 (Culture): English (United States) - en-US
鍵盤佈局 (Layout): US
語言識別碼 10 進位顯示: 67699721
語言識別碼 16 進位顯示: 0x4090409
---------------------------------------
    

在筆者目前的測試中只能切換英文/中文輸入法,無法切換微軟倉頡、微軟注音等:
    
    public const uint WM_INPUTLANGCHANGEREQUEST = 0x0050;
    public const uint KLF_ACTIVATE = 1;
    
    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags);
    

    
        IntPtr foregroundWindow = GetForegroundWindow();
        // string spmKLID = "67699721"; // 英文
        string spmKLID = "67372036"; // 中文
        
        // 切換輸入法
        IntPtr spmLayout = LoadKeyboardLayout(spmKLID, KLF_ACTIVATE); 
        SendMessage(foregroundWindow, WM_INPUTLANGCHANGEREQUEST, spmLayout, IntPtr.Zero);
    

留言