#c# #wpf #windows #keyboard #sendmessage
Вопрос:
Я программно изменяю раскладку клавиатуры в Windows с помощью глобальных горячих клавиш с помощью:
IntPtr fGWindow = GetForegroundWindow();
SendMessage(fGWindow.ToInt32(), WM_INPUTLANGCHANGEREQUEST_as_unit, IntPtr.Zero, LoadKeyboardLayout(LANG, KLF_SUBSTITUTE_OK));
Код работает идеально, за исключением случаев, когда я щелкаю мышью по панели задач Windows (фокусируясь на ней в данный момент). В этой ситуации сообщение отправляется, но LoadKeyboardLayout()
не выполняется.
Использование HWND_BROADCAST
вместо GetForegroundWindow()
не помогает.
ОБНОВЛЕНИЕ / Дополнительная информация:
Указатель, полученный, GetForegroundWindow()
когда я нажимаю на панель задач (фокусируя ее), принадлежит explorer.exe
. В этой ситуации код не работает.
Ответ №1:
Вот решение, в основном необходимы корректировки, если текущее окно переднего плана находится в системном трее:
IntPtr shell_TrayWnd = FindWindow("Shell_TrayWnd", null);
if (fGWindow == shell_TrayWnd)
{
IntPtr vHandle = FindWindow("Progman", "Program Manager"); // Desktop Handler.
SetForegroundWindow(vHandle);
SendMessage(vHandle.ToInt32(), WM_INPUTLANGCHANGEREQUEST_as_unit, new IntPtr(-1), LoadKeyboardLayout(LANG, KLF_NOTELLSHELL));
}