kurumpa
@kurumpa

Какого получателя указывать у сообщения WM_INPUTLANGCHANGEREQUEST?

В своем переключателе раскладки я столкнулся с проблемой переключения раскладки в скайпе (судя по отзывам, это не единственная программа, в которой наблюдается такое поведение). Проблема довольно странная: если в окне набора сообщения только одна буква, все работает как надо, иначе - сообщение 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(). Куда это сообщение по идее слать надо?
  • Вопрос задан
  • 2791 просмотр
Пригласить эксперта
Ответы на вопрос 1
rdifb0
@rdifb0
Программист, реалист
В своей переключателе я использую такой кусок кода (собранный из мира по нитке)
void function()
{
	var threadInfo = new WinAPI.GUITHREADINFO();
	threadInfo.cbSize = Marshal.SizeOf(threadInfo);
	WinAPI.GetGUIThreadInfo(0, ref threadInfo);

	IntPtr hWnd = (threadInfo.hwndFocus != IntPtr.Zero) ? threadInfo.hwndFocus : threadInfo.hwndActive;
	WinAPI.PostMessage(hWnd, WinAPI.WM_INPUTLANGCHANGEREQUEST, WinAPI.WM_INPUTLANGCHANGE_SYSCHARSET, (int)_seconLayot);
}

где WinAPI это просто класс с описанными структурами и Dll импортом. Никаких проблем с переключением не имею.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы