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

Разработка Far.
Post Reply
Pasha_ZZZ
Posts: 90
Joined: Mon 12 Jun, 2006 14:58
Contact:

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

Post by Pasha_ZZZ » Wed 21 Aug, 2019 15:43

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

User avatar
DrKnS
Posts: 5368
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 219 times

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

Post by DrKnS » Wed 21 Aug, 2019 18:46

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

User avatar
DrKnS
Posts: 5368
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 6 times
Been thanked: 219 times

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

Post by DrKnS » Wed 21 Aug, 2019 19:27

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

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

2useven10
Posts: 3914
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 164 times

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

Post by 2useven10 » Wed 21 Aug, 2019 20:17

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

2useven10
Posts: 3914
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 164 times

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

Post by 2useven10 » Fri 23 Aug, 2019 13:14

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

2useven10
Posts: 3914
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 164 times

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

Post by 2useven10 » Fri 23 Aug, 2019 14:13

Можно, конечно, выбирать отличающийся (если есть). Для макроса приемлемый вариант, для far сомнительный.
Last edited by 2useven10 on Fri 23 Aug, 2019 15:01, edited 1 time in total.

2useven10
Posts: 3914
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 164 times

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

Post by 2useven10 » Fri 23 Aug, 2019 22:09

Как-то так вроде бы работает...
Last edited by 2useven10 on Sat 24 Aug, 2019 13:51, edited 3 times in total.

2useven10
Posts: 3914
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 164 times

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

Post by 2useven10 » Sat 24 Aug, 2019 00:33

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

2useven10
Posts: 3914
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 164 times

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

Post by 2useven10 » Sat 24 Aug, 2019 06:51

скрипт поправлен -- должен работать под ConEmu.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sat 24 Aug, 2019 11:43

2useven10, это функция определения текущей раскладки. А как обстоят дела в Windows 10 с переключением раскладки (Far.KbdLayout(1), Far.KbdLayout(-1)) - это работает из коробки?

2useven10
Posts: 3914
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 4 times
Been thanked: 164 times

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

Post by 2useven10 » Sat 24 Aug, 2019 12:08

У меня переключается нормально -- 1, -1, 0x04090409, 0x04190419
Last edited by 2useven10 on Sat 24 Aug, 2019 12:10, edited 2 times in total.

Shmuel
Posts: 5860
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 22 times
Been thanked: 215 times

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

Post by Shmuel » Sat 24 Aug, 2019 12:19

А переключение в определённую раскладку работает (Far.KbdLayout(0x0409 или 0x0419) ?

User avatar
John Doe
Бюрократ
Posts: 12364
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sat 24 Aug, 2019 12:23

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

User avatar
John Doe
Бюрократ
Posts: 12364
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sat 24 Aug, 2019 12:25

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

viewtopic.php?p=147756#p147756

User avatar
John Doe
Бюрократ
Posts: 12364
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sun 25 Aug, 2019 12:55

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.

User avatar
John Doe
Бюрократ
Posts: 12364
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 33 times
Been thanked: 171 times

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

Post by John Doe » Sun 25 Aug, 2019 13:02

Удалось воспроизвести.
Не работает после обновления фара плагином UpdateEx, после того как обновлённый фар перезапускается в той же консоли.

Post Reply

Return to “Development”