В своем
переключателе раскладки я столкнулся с проблемой переключения раскладки в скайпе (судя по отзывам, это не единственная программа, в которой наблюдается такое поведение). Проблема довольно странная: если в окне набора сообщения только одна буква, все работает как надо, иначе - сообщение WM_INPUTLANGCHANGEREQUEST не обрабатывается. Код отправки сообщения:
public static void SetNextKeyboardLayout()
{
IntPtr hWnd = GetForegroundWindow();
uint processId;
uint activeThreadId = GetWindowThreadProcessId(hWnd, out processId);
uint currentThreadId = GetCurrentThreadId();
AttachThreadInput(activeThreadId, currentThreadId, true);
IntPtr focusedHandle = GetFocus();
AttachThreadInput(activeThreadId, currentThreadId, false);
PostMessage(focusedHandle == IntPtr.Zero ? hWnd : focusedHandle, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_FORWARD, HKL_NEXT);
}
focusedHandle делалось для WPF-приложений, без этого куска в них раскладка не переключается. Я подозреваю, что неправильно указываю получателя сообщения. Просто GetForegroundWindow() не подходит, как и любые сочетания GetParentWindow(). Куда это сообщение по идее слать надо?