В своей переключателе я использую такой кусок кода (собранный из мира по нитке)
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 импортом. Никаких проблем с переключением не имею.