Как получить макет 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, хотя только для настольных приложений.