Sami Jildeh Ответов: 0

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"));
            }
        }
    }
}

0 Ответов