Kilo icon indicating copy to clipboard operation
Kilo copied to clipboard

Не работает в меню пуск

Open zapominai opened this issue 6 years ago • 2 comments

Если нажать "пуск" и начать набирать там текст (для поиска программы) то Kilo не детектирует переключение.

winAPI хук, в этом случает, просто не вызывается. Понятное дело, что раздражать это может только таких психов как я, но всё равно решил написать.

Столкнулся с такой особенностью при разработке. У себя в программе обошёл через опрос состояния раскладки по таймеру. Спасает в этом случае, но в некоторых консольных приложениях и такой способ не работает.

zapominai avatar Jul 15 '19 17:07 zapominai

А есть пример чтения текущей раскладки по таймеру под рукой? добавил бы и такой метод отслеживания в Kilo в качестве опционального метода отслеживания текущей раскладки.

artyompetrov avatar Aug 08 '20 16:08 artyompetrov

т.к. этот код обязан использовать 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());
    }

`

zapominai avatar Aug 08 '20 17:08 zapominai