Inputlanguage.currentinputlanguage не работает
Я создаю программное обеспечение для переключения языка ввода в соответствии с активным окном.
Я могу получить активный заголовок окна, а затем проверить его, чтобы увидеть, хочу ли я переключить язык на английский или на арабский.
Я сделал так, что когда текст текстового поля меняется, я проверяю текст текстового поля, и если я получаю совпадение, я устанавливаю SetKeyboardLayout(GetInputLanguageByName ("ar"));
public static InputLanguage GetInputLanguageByName(string inputName) { foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) { //if (lang.Culture.EnglishName.ToLower().StartsWith(inputName)) if (lang.Culture.TwoLetterISOLanguageName == inputName) { return lang; } } return null; } private void SetKeyboardLayout(InputLanguage layout) { InputLanguage.CurrentInputLanguage = layout; MessageBox.Show(InputLanguage.CurrentInputLanguage.Culture.EnglishName); }
Если я проверю, каков текущий язык ввода после того, как он изменит язык, я получу, например, арабский, но Windows сохранит английский в качестве языка ввода.
Но если в операторе IF я установил его на это
if(true) { SetKeyboardLayout(GetInputLanguageByName("ar")); }
Windows меняет язык ввода на арабский.
Я вижу, что если программное обеспечение выполнит SetkeyboardLayout сразу после того, как оно открыло Windows, измените язык, но если программное обеспечение выполнит его через некоторое время, Windows не изменит его.
Кто-нибудь знает почему?
Что я уже пробовал:
Here is my class code <pre lang="C#">using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SQLite; using System.Runtime.InteropServices; using System.Text.RegularExpressions; namespace JustTyping { public partial class Form1 : Form { WinEventDelegate dele = null; IntPtr m_hhook = IntPtr.Zero; delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime); [DllImport("user32.dll")] static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags); [DllImport("user32.dll")] public static extern bool UnhookWinEvent(IntPtr hWinEventHook); private const uint WINEVENT_OUTOFCONTEXT = 0; private const uint EVENT_SYSTEM_FOREGROUND = 3; [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); public Form1() { InitializeComponent(); dele = new WinEventDelegate(WinEventProc); m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, dele, 0, 0, WINEVENT_OUTOFCONTEXT); } #region methods private string GetActiveWindowTitle() { const int nChars = 256; IntPtr handle = IntPtr.Zero; StringBuilder Buff = new StringBuilder(nChars); handle = GetForegroundWindow(); if (GetWindowText(handle, Buff, nChars) > 0) { return Buff.ToString().Trim(); } return null; } public void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) { textBox2.Text = GetActiveWindowTitle(); } public static InputLanguage GetInputLanguageByName(string inputName) { foreach (InputLanguage lang in InputLanguage.InstalledInputLanguages) { //if (lang.Culture.EnglishName.ToLower().StartsWith(inputName)) if (lang.Culture.TwoLetterISOLanguageName == inputName) { return lang; } } return null; } private void SetKeyboardLayout(InputLanguage layout) { InputLanguage.CurrentInputLanguage = layout; MessageBox.Show(InputLanguage.CurrentInputLanguage.Culture.EnglishName); } #endregion private void titleName_txt_TextChanged(object sender, EventArgs e) { bool match = Regex.IsMatch(textBox2.Text, @"Telegram"); if (match) { SetKeyboardLayout(GetInputLanguageByName("ar")); } } bool stop = false; private void stopB_Click(object sender, EventArgs e) { if (stopB.Text == "Stop") stop = UnhookWinEvent(m_hhook); else if (stopB.Text == "Start") { dele = new WinEventDelegate(WinEventProc); m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, dele, 0, 0, WINEVENT_OUTOFCONTEXT); stop = false; } if(stop) { stopB.Text = "Start"; } else { stopB.Text = "Stop"; } } private void textBox2_TextChanged(object sender, EventArgs e) { bool match = Regex.IsMatch(textBox2.Text.ToLower(), "Telegra".ToLower()); if (textBox2.Text.ToLower().StartsWith("Viber".ToLower())) { SetKeyboardLayout(GetInputLanguageByName("ar")); } } } }