LoadKeyboardLayout() не удается изменить раскладку клавиатуры, если панель задач Windows имеет текущий фокус

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