Варианты переключения раскладки клавиатуры

ActiveX, .NET, DLL
Ответить
bartex
user
user
Сообщения: 73
Зарегистрирован: 14 апр 2014, 21:09
Версия LabVIEW: 2015
Откуда: Санкт-Петербург

Варианты переключения раскладки клавиатуры

Сообщение bartex »

Здравствуйте всем.
Потребовалось тут мне программно менять раскладку клавиатуры по щелчку мыши в текстовых полях – если поле для ввода русскими буквами, раскладка становится RU; если в поле нужно вводить английский текст, раскладка меняется на EN.

Погуглив, я нашёл древнюю тему «dll про клавиатуру», все вложения из которой оказались незагружаемыми. Пришлось разбираться самому, что для человека, незнакомого с текстовыми языками программирования оказалось ещё тем лабиринтом.

В итоге свою проблему я всё же решил (см вложения) но возник вопрос: почему разработчики LV не упростили процедуру работы с библиотеками WinApi и не сделали лабвьюшные шаблоны (обёртки) для хотя бы самых популярных функций. (Или я что-то упустил и это уже давно сделано?) Конфигурирование Call Library Function – ну очень сомнительное удовольствие. Это даже Тревис признаёт (стр 680).

И второй вопрос: а можно ли как-то ещё – помимо привлечения user32.dll – переключать раскладку с русского на английский и обратно с помощью мыши?
Вложения
Раскл.PNG
Раскладка.vi
(18.24 КБ) 248 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Варианты переключения раскладки клавиатуры

Сообщение dadreamer »

bartex писал(а):почему разработчики LV не упростили процедуру работы с библиотеками WinApi и не сделали лабвьюшные шаблоны (обёртки) для хотя бы самых популярных функций.
Этих функций сотни, если не больше, это во-первых, а во-вторых, :labview: - кроссплатформенная среда, и реализация для Windows должна быть выполнена так же для Mac и Linux, что не всегда возможно и требует затрат ресурсов. Время от времени такие реализации выполняются в рамках новых версий :labview: . А то, что не реализовано, на Windows можно использовать через "родные" библиотеки, благо MSDN всегда под рукой и там всё прекрасно описано.
bartex писал(а):Конфигурирование Call Library Function – ну очень сомнительное удовольствие. Это даже Тревис признаёт (стр 680).
Мудрость приходит с опытом. Выполнив подобные задачи с десяток раз, вы уже проще будете настраивать CLFN в следующий раз. Главное, соблюдать соглашение о вызове, количество, тип и порядок следования параметров.
bartex писал(а):можно ли как-то ещё – помимо привлечения user32.dll – переключать раскладку
Если только вызывать специальное консольное приложение, но оно по сути так же будет обращаться к WinAPI, так что этот вариант ничем не лучше.
bartex
user
user
Сообщения: 73
Зарегистрирован: 14 апр 2014, 21:09
Версия LabVIEW: 2015
Откуда: Санкт-Петербург

Re: Варианты переключения раскладки клавиатуры

Сообщение bartex »

Dedreamer, спасибо за ответы.

Но я продолжу свои чайницкие вопросы по WinAPI.
Практикуясь с библиотеками, я сделал программку (ну как сделал, скорее стащил с ni.com и переделал), которая следит за раскладкой клавиатуры, а также позволяет её изменять щелчком мыши в соответствующем поле. (См вложение)
Там для того, чтобы лицевая панель была всегда поверх всех окон, используется функция SetWindowPos. Её параметры я тупо скопировал отсюда: https://lavag.org/topic/12751-how-do-yo ... frontmost/
Но мне совершенно непонятно, почему, например, аргумент hWndInsertAfte = -1, хотя тип данных U32? Почему комбинации флогов соответствуют именно эти числа? Почему типу данных BOOL в прототипе соответствует U8 в CLFN … ну и так далее. :dntknw:

На эти вопросы можно не отвечать, так как они скорее всего дурацкие. Ответьте, пожалуйста, на такой: что можно почитать на эту тему, чтобы разобраться самостоятельно во всех этих вопросах?
Для того, чтобы быстро распутать клубок, нужно для начала найти конец нити. Где же та книжка, прочитав которую я буду щёлкать эти функции, как семечки? :think:
dadreamer Сегодня, 09:00
Если только вызывать специальное консольное приложение..
Командная строка меня уже не пугает. Можете намекнуть, что именно нужно вызывать с помощью System Exec? Или там нужно будет что-то писать на Си, а потом вызывать exe-шник? :shok:
Вложения
RU-EN.PNG
Keyboard Mouse.vi
(38.77 КБ) 257 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Варианты переключения раскладки клавиатуры

Сообщение dadreamer »

почему, например, аргумент 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
);
Теперь открываем описание типов данных Windows. Из него узнаём, что HWND = HANDLE = PVOID = void * , то есть, это указатель на какие-то данные. Как известно, в 32-битной IDE указатель равен 4 байта, в 64-битной - 8. Отрицательным указатель не бывает. Но в вашем случае функция так устроена, что принимает зарезервированные значения -1 (HWND_TOPMOST) и -2 (HWND_NOTOPMOST) (редкое явление, на самом деле). Исходя из этого, в :labview: ставим тип I32 (x64) или I64 (x64), а ещё правильней - Signed Pointer Sized Integer. В этом случае :labview: сам определит в зависимости от платформы (x32/x64), сколько байт приходится на указатель. Далее идёт int, это обычный I32, UINT - это unsigned int = U32.
На вашей диаграмме типы первых двух параметров надо поменять, потому что в таком виде :labview: конвертирует -1 в 0 до вызова DLL.
Почему комбинации флогов соответствуют именно эти числа?
Возможные флаги и их описания приведены в MSDN по той же ссылке.
Почему типу данных BOOL в прототипе соответствует U8 в CLFN
BOOL = int = I32. Так что у вас ещё одна поправочка.
что можно почитать на эту тему, чтобы разобраться самостоятельно во всех этих вопросах?
Где же та книжка, прочитав которую я буду щёлкать эти функции, как семечки?
Вряд ли такая универсальная книжка существует (как обычно бывает). Может быть, кто-то её видел, но лично я - нет. Могу только посоветовать метод проб и ошибок. Пишете в какой-нибудь текстовой среде простейшие библиотеки и пытаетесь вызвать их из :labview: . Начинаете с обычных типов данных, с минимальным числом параметров. Используете какие-нибудь простые коды, например сложение двух чисел. Потом что-то посложнее, например, работа с массивом: перегоняете массив в :labview: из DLL и обратно. Следующим этапом может быть вызов чужих функций с того же MSDN, например. Что-то несложное, такое как MessageBox (по моему, этот пример даже где-то в справке :labview: был). Ну, и с каждым шагом усложняете себе условия. Я лично похожим способом освоил эти "азы", правда я редко придумывал себе задания, благо их на работе хватало с лихвой :)
Можете намекнуть, что именно нужно вызывать с помощью System Exec? Или там нужно будет что-то писать на Си, а потом вызывать exe-шник?
Похоже на то, ибо сходу не удалось найти никаких программ для смены раскладки.

Кстати, не используйте FindWindow, в :labview: есть средство более надёжное для получения хэндла фронтальной панели:
post-17237-0-27785800-1297456090.png
post-17237-0-27785800-1297456090.png (12.07 КБ) 5771 просмотр
(взято отсюда).
bartex
user
user
Сообщения: 73
Зарегистрирован: 14 апр 2014, 21:09
Версия LabVIEW: 2015
Откуда: Санкт-Петербург

Re: Варианты переключения раскладки клавиатуры

Сообщение bartex »

dadreamer Вчера, 23:02
Спасибо за подробные разъяснения . Пойду зубрить матчасть.

И это будет настоящая битва, ибо:)
"Не так это просто - в моем возрасте вновь приниматься за рисование, если за всю свою жизнь только и нарисовал что удава снаружи и изнутри, да и то в шесть лет!" (Антуан де Сент-Экзюпери. Маленький принц)
Ответить

Вернуться в «Коммуникация с приложениями»