46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
|
1 | |
Как программно определить текущую раскладку клавиатуры?04.03.2020, 21:11. Показов 9524. Ответов 19
Метки нет (Все метки)
Хочу написать для себя небольшую программку, которая будет постоянно показывать на экране монитора небольшое окошко, на котором будет высвечиваться текущее время и раскладка клавиатуры ("RU" или "ENG"). Как сделать это окно в стиле TopMost я знаю, как время вывести тоже знаю. А вот как программно определить текущую раскладку клавиатуры? И ещё, как можно ловить события изменения раскладки клавиатуры, чтобы изменения мгновенно отображались?
0
|
04.03.2020, 21:11 | |
Ответы с готовыми решениями:
19
Как определить текущую раскладку клавиатуры? Как определить раскладку клавиатуры (язык) в фоновом режиме? Программно установить Русскую раскладку клавиатуры (именно установить, не активировать) Как получить текущую раскладку клавиатуры? |
04.03.2020, 21:33 | 2 | |||||
Сообщение было отмечено Power_Basic как решение
Решение
Win API GetKeyboardLayout
если совсем простой код, то вот
2
|
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
|
05.03.2020, 14:33 [ТС] | 3 |
Спасибо, работает.
Как говорится, дарёному коню в зубы не смотрят, но ... Уж очень это всё-таки как-то ресурсо-затратно вызывать функцию таймера каждые, например, 100 миллисекунд в течении всего дня. Хотя, разумеется, для современного компьютера это как слону дробинка, я согласен, но пресловутый "хороший стиль программирования" подталкивает меня к поиску более рационального решения Мне почему-то мечталось, что должен быть какой-нибудь способ отлавливать сообщение операционной системы о смене раскладки. Ну есть же в Визуальном Бэйсике всякие хитрые предустановленные объекты - Screen и ему подобные. Неужели ни один из них не умеет ловить событие смены раскладки? Тогда можно было бы именно туда "повесить" наш код, и это было бы гораздо более изящно. Ну или как-нибудь с помощью механизма WinAPI можно было бы организовать такой "отлов"? На самом деле, для моей простенькой программки, как говорится, "и так сойдёт", но мне уже просто любопытно было бы узнать, существует такая возможность в принципе или нет. Ну будем говорить, сейчас уже даже не для практической цели, а хотя бы для чисто теоретической, с целью обучения.
0
|
63 / 48 / 12
Регистрация: 28.12.2014
Сообщений: 270
|
|
05.03.2020, 15:23 | 4 |
Имя окна, получающего оконные сообщения при смене раскладки - "TF_FloatingLangBar_WndTitle", класс окна "CiceroUIWndFrame". По имени окна и классу окна находится хэндл окна, по хэндлу окна находится id потока, которому принадлежит окно, в цепочку обработки сообщений потока устанавливает хук, хук мониторит сообщения, в случае получения сообщения, которое указывает на смены раскладки, хук процедура отправляет уведомления процессу пользовательского приложения, которое в свою очередь, либо просматривает свою очередь сообщений потока и обрабатывает событие смены раскладки клавиатуры, либо делает это через RPC - remote procedure call.
1
|
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
|
05.03.2020, 16:51 [ТС] | 5 |
Ну это точно из серии "уж лучше бы и не спрашивал", не открывал этот ящик Пандоры
Но в любом случае, спасибо за эту "дорожную карту", буду пробовать разобраться. А то надоело уже постоянно по верхам скользить, хочется уже когда-нибудь и поглубже копнуть
0
|
05.03.2020, 18:59 | 6 |
Почему то мне кажется это ненадёжный способ. А если на компе отключена языковая панель, кто то удалил ctfmon.exe из автозагрузки или вообще с компа? А индикацию осуществляет другая программа, у меня например это Punto Switcher.
0
|
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
|
05.03.2020, 23:01 [ТС] | 7 |
Короче, полистал я в интернете материалы на эту тему, полистал, и понял, что это тема для докторской диссертации, за которую мне - простому смертному - лучше не браться вовсе, а, и правда, довольствоваться рабоче-крестьянским таймером
У меня сейчас 2 языковых индикатора, расположенных на панели задач - один от системы, второй от Punto Switcher. Но проблема в том, что когда я запускаю IDE визуального бэйсика на своём Windows 10, панель задач почему-то отказывается появляться, как это обычно происходит, когда я подвожу курсор к краю экрана. Обычно-то у меня панель задач убирается автоматически, я к этому уже очень давно привык, и мне это нравится. А тут возникает такая ситуация, что для того, чтобы увидеть индикатор раскладки мне приходится поштучно минимизировать все открытые окна, поскольку они тоже в такие моменты начинают "бастовать", ну или нажимать клавишу "Win", заставляя всё-таки панель задач показаться, но это не удобно совсем, да и раздражает как-то, если честно. Вот потому-то и появилось желание сделать дополнительное самодельное плавающее окошко с часами и индикатором раскладки. Кстати, мне сейчас пришла мысля, что можно ещё дополнительно при смене раскладки озвучивать голосом диктора текущую раскладку. Это же совсем не сложно будет сделать и должно быть очень удобно вроде бы, надо будет попробовать. Всё-таки зрение-то уже, увы, далеко не идеальное P.S. Punto Switcher у меня присутствует на компе уже даже и сам не знаю зачем Автоматическую смену раскладки я уже давным-давно отключил. Использую только Дневник, который иногда реально выручает, ну и ещё "повесил" на сочетание клавиш CTRL + "Б" появление окошка с содержимым всего буфера обмена, что очень удобно, на самом деле.
0
|
06.03.2020, 06:40 | 8 |
Сообщение было отмечено Power_Basic как решение
Решение
Может быть удобно, когда индикатор привязан к курсору.
Есть программа десятилетней давности, написал Пётр aka locm на том форуме. Он пишет на PureBasic правда, но идею можно подхватить, если понравится, программа и исходный код в комплекте: KlavaState_Cursor.zip Тоже на таймере индикация, без высших материй.
1
|
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
||||||
06.03.2020, 17:49 [ТС] | 9 | |||||
Спасибо, идея мне понравилась.
Когда одна раскладка, лампочка ScrollLock на клавиатуре горит, когда другая - погашена. Согласен, удобно. Тогда, по идее, уже и плавающее окно не нужно И дополнительный индикатор раскладки в трее тоже не нужен, потому что там их и без того уже с изьытком Но вот чего я не понял. Как следует из названия этой небольшой программки, курсор мыши при изменении раскладки тоже вроде бы должен менять свою форму, или нет? А, в принципе, это было бы удобно, всегда перед глазами текущая раскладка в виде привязанной к ней формы курсора. Да, удобно. Но у меня не меняет почему-то, хотя пробовал уже и в Windows 10, и в WindowsXP в виртуальном боксе. Чтобы разобраться в этом вопросе долго пытался просмотреть как-нибудь содержимое файла "cursor.res" в Power Basic'е, но я в таких делах не особо опытный, поэтому ничего из этого не получилось. По идее, там можно такие файлы открывать, но мне как-то никогда раньше не приходилось А в Визуальном даже и не знаю, имеется ли вообще такая возможность. Разумеется, я в PureBasic'е более чем слабоват, но, как я понял, по замыслу автора, курсор всё-таки вроде бы должен меняться в зависимости от раскладки:
0
|
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
|||||||||||
06.03.2020, 20:07 [ТС] | 12 | ||||||||||
Виноват, сразу не сообразил почему-то
Ну да, работает, удобно, спасибо! А можно как-нибудь в Визуальном зажигать и гасить лампочку ScrollLock? А то, я смотрю, в Пюре это вобще пара пустяков:
А если в Визуальном это невозможно, тогда как с помощью WinAPI можно добиться такого эффекта?
0
|
06.03.2020, 21:15 | 13 | |||||
Для USB HID клавиатур есть такой код.
1
|
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
|
06.03.2020, 21:50 [ТС] | 14 |
Не, ну я на PureBasic'е ничего не понимаю, совершенно не знакомый язык
Вот если бы на PowerBasic'е
0
|
06.03.2020, 21:54 | 15 |
Можно много кода написать, как у locm и это очень правильно.
А можно попробовать SendKeys "{SCROLLLOCK}" Или API имитировать нажатие клавиши на клавиатуре при помощи keybd_event Почему попробовать? Просто не знаю, как win 10 на это реагирует.
0
|
06.03.2020, 21:56 | 16 |
Если кратко, процедура Open_Key_Device() перечисляет все HID клавиатуры и возвращает дескриптор первой найденной.
Процедура SetLedState() отправляет драйверу клавиатуры сообщение с информацией какие индикаторы нужно включить.
1
|
06.03.2020, 22:51 | 17 | |||||
Сообщение было отмечено Power_Basic как решение
Решение
вот простой код, который включает и выключает индикатор SCROLL LOCK, имитируя нажатие клавиши на клавиатуре:
1
|
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
|
07.03.2020, 15:44 [ТС] | 18 |
Классно! Мне понравилось!
Даже как-то неожиданно, что лампочкой можно вот так вот легко управлять Беру на вооружение! На десятке работает превосходно! Ну да, наверно это очень правильно, но это такой тернистый путь, на который даже и ступить страшно
0
|
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 435
|
||||||
09.03.2020, 19:40 [ТС] | 20 | |||||
Спасибо, попробовал, работает хорошо.
Возможно я к идее плавающего окона ещё вернусь, если появятся мысли, какую важную информацию надо выводить на экран. Ну например, "Не забудь поздравить тёщу с днём рождения" или что-нибудь ещё в таком роде Будем считать, что это был очень полезный для меня урок по WinAPI. Вот например, про эту функцию
0
|
09.03.2020, 19:40 | |
09.03.2020, 19:40 | |
Помогаю со студенческими работами здесь
20
Как получить текущую раскладку клавиатуры для чужого активного окна? Как программно сменить раскладку клавиатуры Как определить раскладку клавиатуры? Как определить раскладку клавиатуры консольного приложения? Программно JS установить раскладку клавиатуры с русского на английский и обратно Программно эмулировать нажатие клавиш, различая регистр и раскладку клавиатуры Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |