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

Разработка Far.
Pasha_ZZZ
Posts: 430
Joined: Mon 12 Jun, 2006 14:58
Has thanked: 1 time
Been thanked: 27 times
Contact:

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

Post by Pasha_ZZZ »

Ф-ция kbdLayoutFunc() в macro.cpp возвращает 0 на десятке.
Недокументенная функа GetConsoleKeyboardLayoutNameW возвращает ошибку на 10ке, так что дополнительные проверки не требуются. Просто в console.cpp функцию console::GetKeyboardLayoutName(string &strName) чуть переделать и вместо return false добавить дополнительный if с вызовом GetKeyboardLayoutName (у них с уже использованной формат вывода подходящий). А уж если эта не удалась - тогда return false
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

Pasha_ZZZ wrote: Wed 21 Aug, 2019 15:43вместо return false добавить дополнительный if с вызовом GetKeyboardLayoutName
А смысл этого?
GetKeyboardLayoutName всегда возвращает тот layout, который был в момент запуска консоли, и нет, в 10 это не починили.
Именно поэтому в Far используется недокументированная альтернатива.
Лучше уж фейл, чем возвращать шопопало.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

Нашел у них открытый issue на эту тему: https://github.com/microsoft/terminal/issues/83

Вы знаете, что делать.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

DrKnS wrote: Wed 21 Aug, 2019 18:46 GetKeyboardLayoutName всегда возвращает тот layout, который был в момент запуска консоли
Вроде как ф-я сама по себе работает, просто для консоли нет нормального способа найти нужный аргумент.
Нарылся такой проект на гитхабе -- https://github.com/Elfy/getconkbl,
не проверял, даже если работает - это просто некоторая эвристика, никаких гарантий, ну и слишком много приседаний.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

2useven10 wrote: Wed 21 Aug, 2019 20:17 не проверял,
Проверил. Код можно сильно упростить, оставив только 2 toolhelp снимка (процессы и потоки) и пробег по ним.
Среди потоков conhost.exe, владельцем которого является фар, дейтвительно есть такой с которым GetKeyboardLayout(thread_id) отдаёт текущий (а не тот что был при старте) KbdLayout. Но у меня на Win10 это третий поток из 5 (а не второй из 4 как в гитхабовских сорсах).
Как вытаскивать правильный может знать только M$.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

Можно, конечно, выбирать отличающийся (если есть). Для макроса приемлемый вариант, для far сомнительный.
Last edited by 2useven10 on Fri 23 Aug, 2019 15:01, edited 1 time in total.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

Как-то так вроде бы работает...
Last edited by 2useven10 on Sat 24 Aug, 2019 13:51, edited 3 times in total.
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

Старшая половина почему-то через GetKeyboardLayout() и GetkeyboardLayoutName() при переключении на русский отличается.
И 16 бит вполне хватает для выяснения факта переключения, поэтому обрезано.
PS: в скрипте была глобальная переменная - исправил. Может и ещё есть косяки - сообщайте...
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

скрипт поправлен -- должен работать под ConEmu.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

2useven10, это функция определения текущей раскладки. А как обстоят дела в Windows 10 с переключением раскладки (Far.KbdLayout(1), Far.KbdLayout(-1)) - это работает из коробки?
2useven10
Posts: 5205
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

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

Post by 2useven10 »

У меня переключается нормально -- 1, -1, 0x04090409, 0x04190419
Last edited by 2useven10 on Sat 24 Aug, 2019 12:10, edited 2 times in total.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

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

Post by Shmuel »

А переключение в определённую раскладку работает (Far.KbdLayout(0x0409 или 0x0419) ?
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Shmuel wrote: Sat 24 Aug, 2019 12:19 А переключение в определённую раскладку работает (Far.KbdLayout(0x0409 или 0x0419) ?
Работает.
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

Но остаётся ещё проблема с кастомными раскладками

viewtopic.php?p=147756#p147756
User avatar
John Doe
Бюрократ
Posts: 13807
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 73 times
Been thanked: 426 times
Contact:

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

Post by John Doe »

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

Update
После перезапуска фара заработало.
Last edited by John Doe on Sun 25 Aug, 2019 12:59, edited 1 time in total.
Post Reply

Return to “Development”