Page 1 of 1

Получение текущей раскладки в Windows 10

Posted: Wed 21 Aug, 2019 15:43
by Pasha_ZZZ
Ф-ция kbdLayoutFunc() в macro.cpp возвращает 0 на десятке.
Недокументенная функа GetConsoleKeyboardLayoutNameW возвращает ошибку на 10ке, так что дополнительные проверки не требуются. Просто в console.cpp функцию console::GetKeyboardLayoutName(string &strName) чуть переделать и вместо return false добавить дополнительный if с вызовом GetKeyboardLayoutName (у них с уже использованной формат вывода подходящий). А уж если эта не удалась - тогда return false

Глюки и баги, появившиеся в «ночных сборках»

Posted: Wed 21 Aug, 2019 18:46
by DrKnS
Pasha_ZZZ wrote:
Wed 21 Aug, 2019 15:43
вместо return false добавить дополнительный if с вызовом GetKeyboardLayoutName
А смысл этого?
GetKeyboardLayoutName всегда возвращает тот layout, который был в момент запуска консоли, и нет, в 10 это не починили.
Именно поэтому в Far используется недокументированная альтернатива.
Лучше уж фейл, чем возвращать шопопало.

Глюки и баги, появившиеся в «ночных сборках»

Posted: Wed 21 Aug, 2019 19:27
by DrKnS
Нашел у них открытый issue на эту тему: https://github.com/microsoft/terminal/issues/83

Вы знаете, что делать.

Глюки и баги, появившиеся в «ночных сборках»

Posted: Wed 21 Aug, 2019 20:17
by 2useven10
DrKnS wrote:
Wed 21 Aug, 2019 18:46
GetKeyboardLayoutName всегда возвращает тот layout, который был в момент запуска консоли
Вроде как ф-я сама по себе работает, просто для консоли нет нормального способа найти нужный аргумент.
Нарылся такой проект на гитхабе -- https://github.com/Elfy/getconkbl,
не проверял, даже если работает - это просто некоторая эвристика, никаких гарантий, ну и слишком много приседаний.

Глюки и баги, появившиеся в «ночных сборках»

Posted: Fri 23 Aug, 2019 13:14
by 2useven10
2useven10 wrote:
Wed 21 Aug, 2019 20:17
не проверял,
Проверил. Код можно сильно упростить, оставив только 2 toolhelp снимка (процессы и потоки) и пробег по ним.
Среди потоков conhost.exe, владельцем которого является фар, дейтвительно есть такой с которым GetKeyboardLayout(thread_id) отдаёт текущий (а не тот что был при старте) KbdLayout. Но у меня на Win10 это третий поток из 5 (а не второй из 4 как в гитхабовских сорсах).
Как вытаскивать правильный может знать только M$.

Получение текущей раскладки в Windows 10

Posted: Fri 23 Aug, 2019 14:13
by 2useven10
Можно, конечно, выбирать отличающийся (если есть). Для макроса приемлемый вариант, для far сомнительный.

Получение текущей раскладки в Windows 10

Posted: Fri 23 Aug, 2019 22:09
by 2useven10
Как-то так вроде бы работает...

Получение текущей раскладки в Windows 10

Posted: Sat 24 Aug, 2019 00:33
by 2useven10
Старшая половина почему-то через GetKeyboardLayout() и GetkeyboardLayoutName() при переключении на русский отличается.
И 16 бит вполне хватает для выяснения факта переключения, поэтому обрезано.
PS: в скрипте была глобальная переменная - исправил. Может и ещё есть косяки - сообщайте...

Получение текущей раскладки в Windows 10

Posted: Sat 24 Aug, 2019 06:51
by 2useven10
скрипт поправлен -- должен работать под ConEmu.

Получение текущей раскладки в Windows 10

Posted: Sat 24 Aug, 2019 11:43
by Shmuel
2useven10, это функция определения текущей раскладки. А как обстоят дела в Windows 10 с переключением раскладки (Far.KbdLayout(1), Far.KbdLayout(-1)) - это работает из коробки?

Получение текущей раскладки в Windows 10

Posted: Sat 24 Aug, 2019 12:08
by 2useven10
У меня переключается нормально -- 1, -1, 0x04090409, 0x04190419

Получение текущей раскладки в Windows 10

Posted: Sat 24 Aug, 2019 12:19
by Shmuel
А переключение в определённую раскладку работает (Far.KbdLayout(0x0409 или 0x0419) ?

Получение текущей раскладки в Windows 10

Posted: Sat 24 Aug, 2019 12:23
by John Doe
Shmuel wrote:
Sat 24 Aug, 2019 12:19
А переключение в определённую раскладку работает (Far.KbdLayout(0x0409 или 0x0419) ?
Работает.

Получение текущей раскладки в Windows 10

Posted: Sat 24 Aug, 2019 12:25
by John Doe
Но остаётся ещё проблема с кастомными раскладками

viewtopic.php?p=147756#p147756

Получение текущей раскладки в Windows 10

Posted: Sun 25 Aug, 2019 12:55
by John Doe
2useven10 wrote:
Fri 23 Aug, 2019 22:09
вроде бы работает...
У меня при любой из 2х раскладок выдаёт 0x04090409.

Update
После перезапуска фара заработало.

Получение текущей раскладки в Windows 10

Posted: Sun 25 Aug, 2019 13:02
by John Doe
Удалось воспроизвести.
Не работает после обновления фара плагином UpdateEx, после того как обновлённый фар перезапускается в той же консоли.