Ваш индикатор не будет работать при таком подходе. Сейчас язык привязывается к каждому приложению, т.е. вы можете работать сразу с несколькими приложениями и в каждом из них будет активна своя раскладка и свой язык. Переключаясь между приложениями язык переключается и индикаторе раскладки.
Не говоря о том, что я вот язык переключаю клавишей CAPS_LOCK.
Мне надо решить именно мою проблему, поэтому сейчас интересует только одно сочетание клавиш.
Язык активного окна любого приложения определить не проблема.
int processId;
var l = GetKeyboardLayout((uint)GetWindowThreadProcessId(GetForegroundWindow(), out processId));
return new CultureInfo((short)l.ToInt64());
Vitaliy Orlov: Вы уже умеете определять язык любого и конкретно вашего приложения. Теперь запускайте таймер и каждые 0.75 секунды проверяйте язык. У меня сейчас так работает подсветка языка лампочкой SCROLL_LOCK'a, задержка лампочки при смене языка почти не ощущается.
Как я понял, вам то нужно при смене языка всплывать индикатор, чтобы в нём выбрать язык из списка, так что нужно сохранять прошлое состояние и всплывать индикатор только при изменении состояния.
Но с хуком решение более правильное и эффективное, но чуть сложнее реализовывается, как мне кажется.
maaGames: именно так я и сделал, только без таймеров, а с запуском отдельного потока и его sleep-ом. Но, это все работает медленно. Мне бы именно Alt+Shift отловить, но никак не могу найти пример..
Вот про хук. Скорее всего вы это уже прочитали, но я не вижу там проблем. Регистрируете callback функцию, которая делает нужные вам вещи при нажатии нужных вам клавиш. https://msdn.microsoft.com/ru-ru/library/windows/d...
sleep однозначно хуже таймера, т.к. потенциально может быть заблокирован гораздо дольше, чем вы задали в аргументе. А таймер срабатывает более-менее точно.
Вне вашего приложения - есть системный индикатор, который можно таскать куда угодно. Хотите сделать такой-же - изучайте хуки.
В вашем приложении вы можете получать текущую раскладку при получении фокуса на ваши окна и выставлять свой индикатор в нужное положение. Для отлова смены раскладки при вашем активном окне - обрабатывайте получение события WM_INPUTLANGCHANGE.
Ты не понял сути вопроса. Мне нужен пример, как отловить глобально нажатие Alt+Shift с примером. Всё. Именно так и написано в заголовке вопроса. Не надо ничего додумывать по функционалу самого приложения :)
SetWindowsHookEx WH_KEYBOARD или WH_KEYBOARD_LL
Обязательна нужна отдельная DLL для установки глобального хука.
Возможно всё-таки тебе нужнее хук не на клавиатуру, а на очередь сообщений WH_GETMESSAGE и отлавливать чужие сообщения WM_INPUTLANGCHANGE