Подскажите как на C# отловить событие смены активного окна ввода или еще лучше
смены раскладки клавиатуры или смены указателя языка на яз. панели (типа RU на EN)
Нужно для драйвера клавиатуры. Если можно уточнить детали, опыт небольшой.
Сам найти не смог.
Здравствуйте, AVALAH, Вы писали:
AVA>Подскажите как на C# отловить событие смены активного окна ввода или еще лучше AVA>смены раскладки клавиатуры или смены указателя языка на яз. панели (типа RU на EN)
WinForms, WPF?
Вот здесь про WPF... Там есть событие InputLanguageChanged
Здравствуйте, AVALAH, Вы писали:
AVA>Здравствуйте, Nikolay_Ch, Вы писали:
N_C>>WinForms, WPF? N_C>>Вот здесь про WPF... Там есть событие InputLanguageChanged
AVA>К сожалению WinForms. AVA>Класс InputLanguageManager не понимает AVA>Пространство имен: System.Windows.Input AVA>Сборка: PresentationCore (в PresentationCore.dll)
Здравствуйте, koodeer, Вы писали:
K>Ну, в WinForms тоже есть событие InputLanguageChanged.
Form.InputLanguageChanged событие родительской формы, мне не подходит нужно отследить глобальную смену раскладки в системе (или смену активного окна с другой раскладкой)
Здравствуйте, AVALAH, Вы писали: AVA>Form.InputLanguageChanged событие родительской формы, мне не подходит нужно отследить глобальную смену раскладки в системе (или смену активного окна с другой раскладкой)
Что есть "глобальная смена раскладки"? Изменение настроек системы по добавлению/удалению раскладок? Потому, как у каждого окна в системе раскладка установлена независимо — при переключениями между окнами раскладка меняется.
Здравствуйте, AVALAH, Вы писали:
AVA>Подскажите как на C# отловить событие смены активного окна ввода или еще лучше AVA>смены раскладки клавиатуры или смены указателя языка на яз. панели (типа RU на EN)
AVA>Нужно для драйвера клавиатуры. Если можно уточнить детали, опыт небольшой. AVA>Сам найти не смог.
10 НАЙТИ ОКНО, ИМЕЮЩЕЕ ФОКУС ВВОДА
20 УЗНАТЬ ЕГО РАСКЛАДКУ
30 СРАВНИТЬ С РАСКЛАДКОЙ, ПОЛУЧЕННОЙ В ПРОШЛЫЙ РАЗ
40 ПАУЗА
50 GOTO 10
Сомневаюсь, что есть что-то получше. Разве что оконные хуки, но они могут привести к
деградации системы, к тому же будут проблемы с UAC.
O>10 НАЙТИ ОКНО, ИМЕЮЩЕЕ ФОКУС ВВОДА
O>20 УЗНАТЬ ЕГО РАСКЛАДКУ
O>30 СРАВНИТЬ С РАСКЛАДКОЙ, ПОЛУЧЕННОЙ В ПРОШЛЫЙ РАЗ
O>40 ПАУЗА
O>50 GOTO 10
O>
O>Сомневаюсь, что есть что-то получше. Разве что оконные хуки, но они могут привести к O>деградации системы, к тому же будут проблемы с UAC.
Да это самый простой и тупой метод, по таймеру проверять текущую раскладку активной формы с фокусом ввода и типа генерировать свое событие.
Но если учитывать что это драйвер и постоянный цикл будет жрать хоть и небольшой ресурс, как то себя перестаешь уважать.
Если оставить смену раскладки, должно же быть событие смены активного окна на системном уровне???
Неужели все так грустно, и защищено в С#???
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Здравствуйте, AVALAH, Вы писали: AVA>>Form.InputLanguageChanged событие родительской формы, мне не подходит нужно отследить глобальную смену раскладки в системе (или смену активного окна с другой раскладкой) N_C>Что есть "глобальная смена раскладки"? Изменение настроек системы по добавлению/удалению раскладок? Потому, как у каждого окна в системе раскладка установлена независимо — при переключениями между окнами раскладка меняется.
Ну типа да, меня интересует событие смены языка ввода не родительской формы а той которая активна на данный момент, другими словами
событие смены указателя языка на яз. панели (типа RU на EN) во всех случаях.
Здравствуйте, AVALAH, Вы писали:
AVA>Если оставить смену раскладки, должно же быть событие смены активного окна на системном уровне??? AVA>Неужели все так грустно, и защищено в С#???
На системной — есть — событие WM_ACTIVATE
Здравствуйте, AVALAH, Вы писали:
AVA>Но если учитывать что это драйвер и постоянный цикл будет жрать хоть и небольшой ресурс, как то себя перестаешь уважать.
Драйвер на C# Вы батенька знаете толк в извращениях.
В чем смысл экономии на спичках? Сам .NET отжирает столько ресурсов что лишних 2-3 цикла погоду не сделают.
Здравствуйте, AVALAH, Вы писали:
AVA>Но если учитывать что это драйвер и постоянный цикл будет жрать хоть и небольшой ресурс, как то себя перестаешь уважать.
Чего не понимаю, это каким боком драйвер клавиатуры оказался связан с раскладками? Драйвер выдает коды нажатых клавишь, о существовании раскладок он знать не должен.
AVA>Если оставить смену раскладки, должно же быть событие смены активного окна на системном уровне??? AVA>Неужели все так грустно, и защищено в С#???
Причем же тут C#?
Здравствуйте, AVALAH, Вы писали:
AVA>Если оставить смену раскладки, должно же быть событие смены активного окна на системном уровне??? AVA>Неужели все так грустно, и защищено в С#???
Сам шарп тут не при чём, проблема — в крайне своеобразной документации. Если ей верить — можно ловить глобальным хуком WM_INPUTLANGCHANGE, как советуют здесь. Проблема в том, что начиная с XP этот код будет работать некорректно.
Рекомендуемый способ — InputLanguageProfileNotifySink.OnLanguageChange(). В WPF есть готовая реализация, класс — internal.
Можно подсмотреть код с помощью ilspy (PresentationCore, System.Windows.Input.InputLanguageProfileNotifySink), можно глянуть на исходник тут. Допилить напильником, использовать на свой страх и риск.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, AVALAH, Вы писали:
AVA>>Но если учитывать что это драйвер и постоянный цикл будет жрать хоть и небольшой ресурс, как то себя перестаешь уважать. S>Чего не понимаю, это каким боком драйвер клавиатуры оказался связан с раскладками? Драйвер выдает коды нажатых клавишь, о существовании раскладок он знать не должен.
AVA>>Если оставить смену раскладки, должно же быть событие смены активного окна на системном уровне??? AVA>>Неужели все так грустно, и защищено в С#??? S>Причем же тут C#?
Может это и не совсем драйвер — это программка которая обслуживает все доп клавиши, и обеспечивает более комфортное переключение раскладок.
Использую активно 3 языка ввода. Выкручивать пальцы чтобы нажать три клавиши и запоминать очередность смены раскладок как то раздражает.
Смысл знать раскладку — подсветить английскую диодом ScrollLock.
Почему на C#? потому что с ним знаком с С++ не сложилось...
Здравствуйте, AVALAH, Вы писали:
AVA>Здравствуйте, samius, Вы писали:
AVA>Может это и не совсем драйвер — это программка которая обслуживает все доп клавиши, и обеспечивает более комфортное переключение раскладок. AVA>Использую активно 3 языка ввода. Выкручивать пальцы чтобы нажать три клавиши и запоминать очередность смены раскладок как то раздражает.
То есть совсем не драйвер. AVA>Смысл знать раскладку — подсветить английскую диодом ScrollLock.
а индикатора на панели задач недостаточно? Вот лично я на клаву вообще не смотрю, куда уж там разбираться, какой из диодов подсвечен...
AVA>Почему на C#? потому что с ним знаком с С++ не сложилось...
Ну дак у C++ с событиями смены активного окна тоже не очень сложено. Это вообще не языковой уровень. Это предметный уровень.