Не работает в меню пуск
Если нажать "пуск" и начать набирать там текст (для поиска программы) то Kilo не детектирует переключение.
winAPI хук, в этом случает, просто не вызывается. Понятное дело, что раздражать это может только таких психов как я, но всё равно решил написать.
Столкнулся с такой особенностью при разработке. У себя в программе обошёл через опрос состояния раскладки по таймеру. Спасает в этом случае, но в некоторых консольных приложениях и такой способ не работает.
А есть пример чтения текущей раскладки по таймеру под рукой? добавил бы и такой метод отслеживания в Kilo в качестве опционального метода отслеживания текущей раскладки.
т.к. этот код обязан использовать thread_process_id он не будет корректно работать в:
- консольных приложениях
- элементах управления виндовс (панель пуск и прочее)
- в приложениях из магазина виндовс
NativeMethods — это WinAPI-функции
layoutHandle = GetLayoutHandleByCulture(HandleCurrentLanguage());
private IntPtr GetLayoutHandleByCulture(CultureInfo culture)
{
List<InputLanguage> LayoutList = InputLanguage.InstalledInputLanguages.Cast<InputLanguage>().ToList();
var lang = LayoutList.Find(
(item) => item.Culture.ThreeLetterISOLanguageName == culture.ThreeLetterISOLanguageName
);
if (lang != null)
{
return lang.Handle;
}
return IntPtr.Zero;
}
private CultureInfo HandleCurrentLanguage()
{
try
{
var currentCulture = GetCurrentCulture();
if (_currentLanaguge == null || _currentLanaguge.LCID != currentCulture.LCID)
{
_currentLanaguge = currentCulture;
}
}
catch (Exception)
{
}
return _currentLanaguge;
}
private static CultureInfo GetCurrentCulture()
{
var l = NativeMethods.GetKeyboardLayout(NativeMethods.GetWindowThreadProcessId(NativeMethods.GetForegroundWindow(), IntPtr.Zero));
return new CultureInfo((short)l.ToInt64());
}
`