Здравствуйте всем.
Потребовалось тут мне программно менять раскладку клавиатуры по щелчку мыши в текстовых полях – если поле для ввода русскими буквами, раскладка становится RU; если в поле нужно вводить английский текст, раскладка меняется на EN.
Погуглив, я нашёл древнюю тему «dll про клавиатуру», все вложения из которой оказались незагружаемыми. Пришлось разбираться самому, что для человека, незнакомого с текстовыми языками программирования оказалось ещё тем лабиринтом.
В итоге свою проблему я всё же решил (см вложения) но возник вопрос: почему разработчики LV не упростили процедуру работы с библиотеками WinApi и не сделали лабвьюшные шаблоны (обёртки) для хотя бы самых популярных функций. (Или я что-то упустил и это уже давно сделано?) Конфигурирование Call Library Function – ну очень сомнительное удовольствие. Это даже Тревис признаёт (стр 680).
И второй вопрос: а можно ли как-то ещё – помимо привлечения user32.dll – переключать раскладку с русского на английский и обратно с помощью мыши?
Варианты переключения раскладки клавиатуры
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Варианты переключения раскладки клавиатуры
Этих функций сотни, если не больше, это во-первых, а во-вторых, - кроссплатформенная среда, и реализация для Windows должна быть выполнена так же для Mac и Linux, что не всегда возможно и требует затрат ресурсов. Время от времени такие реализации выполняются в рамках новых версий . А то, что не реализовано, на Windows можно использовать через "родные" библиотеки, благо MSDN всегда под рукой и там всё прекрасно описано.bartex писал(а):почему разработчики LV не упростили процедуру работы с библиотеками WinApi и не сделали лабвьюшные шаблоны (обёртки) для хотя бы самых популярных функций.
Мудрость приходит с опытом. Выполнив подобные задачи с десяток раз, вы уже проще будете настраивать CLFN в следующий раз. Главное, соблюдать соглашение о вызове, количество, тип и порядок следования параметров.bartex писал(а):Конфигурирование Call Library Function – ну очень сомнительное удовольствие. Это даже Тревис признаёт (стр 680).
Если только вызывать специальное консольное приложение, но оно по сути так же будет обращаться к WinAPI, так что этот вариант ничем не лучше.bartex писал(а):можно ли как-то ещё – помимо привлечения user32.dll – переключать раскладку
-
- user
- Сообщения: 73
- Зарегистрирован: 14 апр 2014, 21:09
- Версия LabVIEW: 2015
- Откуда: Санкт-Петербург
Re: Варианты переключения раскладки клавиатуры
Dedreamer, спасибо за ответы.
Но я продолжу свои чайницкие вопросы по WinAPI.
Практикуясь с библиотеками, я сделал программку (ну как сделал, скорее стащил с ni.com и переделал), которая следит за раскладкой клавиатуры, а также позволяет её изменять щелчком мыши в соответствующем поле. (См вложение)
Там для того, чтобы лицевая панель была всегда поверх всех окон, используется функция SetWindowPos. Её параметры я тупо скопировал отсюда: https://lavag.org/topic/12751-how-do-yo ... frontmost/
Но мне совершенно непонятно, почему, например, аргумент hWndInsertAfte = -1, хотя тип данных U32? Почему комбинации флогов соответствуют именно эти числа? Почему типу данных BOOL в прототипе соответствует U8 в CLFN … ну и так далее.
На эти вопросы можно не отвечать, так как они скорее всего дурацкие. Ответьте, пожалуйста, на такой: что можно почитать на эту тему, чтобы разобраться самостоятельно во всех этих вопросах?
Для того, чтобы быстро распутать клубок, нужно для начала найти конец нити. Где же та книжка, прочитав которую я буду щёлкать эти функции, как семечки?
Но я продолжу свои чайницкие вопросы по WinAPI.
Практикуясь с библиотеками, я сделал программку (ну как сделал, скорее стащил с ni.com и переделал), которая следит за раскладкой клавиатуры, а также позволяет её изменять щелчком мыши в соответствующем поле. (См вложение)
Там для того, чтобы лицевая панель была всегда поверх всех окон, используется функция SetWindowPos. Её параметры я тупо скопировал отсюда: https://lavag.org/topic/12751-how-do-yo ... frontmost/
Но мне совершенно непонятно, почему, например, аргумент hWndInsertAfte = -1, хотя тип данных U32? Почему комбинации флогов соответствуют именно эти числа? Почему типу данных BOOL в прототипе соответствует U8 в CLFN … ну и так далее.
На эти вопросы можно не отвечать, так как они скорее всего дурацкие. Ответьте, пожалуйста, на такой: что можно почитать на эту тему, чтобы разобраться самостоятельно во всех этих вопросах?
Для того, чтобы быстро распутать клубок, нужно для начала найти конец нити. Где же та книжка, прочитав которую я буду щёлкать эти функции, как семечки?
Командная строка меня уже не пугает. Можете намекнуть, что именно нужно вызывать с помощью System Exec? Или там нужно будет что-то писать на Си, а потом вызывать exe-шник?dadreamer Сегодня, 09:00
Если только вызывать специальное консольное приложение..
- Вложения
-
- Keyboard Mouse.vi
- (38.77 КБ) 258 скачиваний
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Варианты переключения раскладки клавиатуры
Открываем описание функции и внимательно читаем.почему, например, аргумент hWndInsertAfte = -1, хотя тип данных U32?
Код: Выделить всё
BOOL WINAPI SetWindowPos(
_In_ HWND hWnd,
_In_opt_ HWND hWndInsertAfter,
_In_ int X,
_In_ int Y,
_In_ int cx,
_In_ int cy,
_In_ UINT uFlags
);
На вашей диаграмме типы первых двух параметров надо поменять, потому что в таком виде конвертирует -1 в 0 до вызова DLL.
Возможные флаги и их описания приведены в MSDN по той же ссылке.Почему комбинации флогов соответствуют именно эти числа?
BOOL = int = I32. Так что у вас ещё одна поправочка.Почему типу данных BOOL в прототипе соответствует U8 в CLFN
что можно почитать на эту тему, чтобы разобраться самостоятельно во всех этих вопросах?
Вряд ли такая универсальная книжка существует (как обычно бывает). Может быть, кто-то её видел, но лично я - нет. Могу только посоветовать метод проб и ошибок. Пишете в какой-нибудь текстовой среде простейшие библиотеки и пытаетесь вызвать их из . Начинаете с обычных типов данных, с минимальным числом параметров. Используете какие-нибудь простые коды, например сложение двух чисел. Потом что-то посложнее, например, работа с массивом: перегоняете массив в из DLL и обратно. Следующим этапом может быть вызов чужих функций с того же MSDN, например. Что-то несложное, такое как MessageBox (по моему, этот пример даже где-то в справке был). Ну, и с каждым шагом усложняете себе условия. Я лично похожим способом освоил эти "азы", правда я редко придумывал себе задания, благо их на работе хватало с лихвой :)Где же та книжка, прочитав которую я буду щёлкать эти функции, как семечки?
Похоже на то, ибо сходу не удалось найти никаких программ для смены раскладки.Можете намекнуть, что именно нужно вызывать с помощью System Exec? Или там нужно будет что-то писать на Си, а потом вызывать exe-шник?
Кстати, не используйте FindWindow, в есть средство более надёжное для получения хэндла фронтальной панели: (взято отсюда).
-
- user
- Сообщения: 73
- Зарегистрирован: 14 апр 2014, 21:09
- Версия LabVIEW: 2015
- Откуда: Санкт-Петербург
Re: Варианты переключения раскладки клавиатуры
Спасибо за подробные разъяснения . Пойду зубрить матчасть.dadreamer Вчера, 23:02
И это будет настоящая битва, ибо:)
"Не так это просто - в моем возрасте вновь приниматься за рисование, если за всю свою жизнь только и нарисовал что удава снаружи и изнутри, да и то в шесть лет!" (Антуан де Сент-Экзюпери. Маленький принц)