Как получить макет IME в С# Winform специально в Wndproc?

У меня есть приложение winform, я хочу получить информацию о текущем языке ввода в С#. У меня машина Windows 10, я выбрал корейский язык. На панели задач есть одна кнопка переключения, чтобы изменить язык ввода на английском или корейском языке, когда я выбираю корейский язык.

Следующий код всегда дает корейский язык, но он должен давать английский, когда я выбираю вход на английском языке.

    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hwnd, IntPtr proccess);
    [DllImport("user32.dll")]
    static extern IntPtr GetKeyboardLayout(uint thread);
    public Form1()
    {
        InitializeComponent();
        IntPtr foregroundWindow = GetForegroundWindow();
        uint foregroundProcess = GetWindowThreadProcessId(foregroundWindow, IntPtr.Zero);
        int keyboardLayout = GetKeyboardLayout(foregroundProcess).ToInt32() & 0xFFFF;
        CultureInfo info = new CultureInfo(keyboardLayout);
        int keyboardLayoutId = info.KeyboardLayoutId;
        string name = info.Name;
    }

Есть ли другой способ получить информацию о входном языке.

Вы можете найти прикрепленное изображение для него. Я выделил A как английский вход. TaskBar Screenshot English Input

TaskBar Screenshot Korean Input

Я хочу эту информацию в методе WndProc.

Проблема Summry: Поэтому я хочу обработать случай, когда пользователь переключил язык на тип с помощью кнопки переключения, я хочу, чтобы какое-либо сообщение wndproc или событие со стороны окна получили информацию о языке, когда Пользователь переключает язык с помощью кнопки переключения.

Ответ 1

Ваш вопрос вызван путаницей режима IME и макета ввода. В обоих случаях ваш формат ввода - корейский - какие изменения вы используете в режиме IME.

Вы можете найти режим IME входного управления с помощью Control.ImeMode (и проверить изменение с помощью Control.ImeModeChanged). Это скажет вам, что вы либо на корейском языке - хангыль, либо на корейском - Alpha. EDIT: На самом деле это позволяет вам принудительно задавать заданную настройку, а не читать пользовательский режим IME и, по-видимому, t.

Дальнейшее усложнение - если вы включили глобальный вход (доступный с Windows 8), где входная конфигурация больше не сохраняется в потоке, а скорее глобальна. В этом случае ImeMode не работает и полностью игнорируется. Я не думаю, что вы можете сделать это со стороны приложения - настройка больше не ваша, чтобы видеть или изменять. Согласно MSDN, правильной заменой будет функция ImmGetConversionStatus, хотя только для настольных приложений.