перехват клавиатуры

Простейшие вопросы в области инженерной разработки
Ответить
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

перехват клавиатуры

Сообщение Artem.spb »

Совсем не чайниковский вопрос, но в другие темы тоже не подходит.
На NI форуме начался какой-то бред, может у меня с английским что-то не то, так что попробую по-русски.
Задача: перехватить клавиатурный ввод в параллельном потоке.

Если надо подробности, то есть гравировальный станок, его родной софт трогать нельзя.
К станку подключён экран (=мышка) и сканер штрих-кодов (=клавиатура). Последний работает в режиме эмуляции клавы, т.е. он именно клавиатура, а не что-то в ком-порте.
Оператор ставит изделие в установку, сканирует штрих-код (он высвечивается на экране), нажимает кнопку «поехали» и всё.
Хочется перед запуском гравирования убедиться, что этот код есть в базе, т.е. изделие прошло тестирование. Если нет, вывести предупреждение, что гравировать не стоит. Каких-то супер блокировок не требуется.
Вариант распознавания символов с экрана возможен, но пока рассматривается как лёгкое извращение, с которым не стоит связываться (да и доп лицензии на вижн денег стоят).

Само собой всякие события и прочие стандартные методы не работают т.к. окно будет свёрнуто, и никаких событий в нём не произойдёт.
Нашёл вариант опроса клавиатуры, но он работает нестабильно. При большом периоде опроса символы теряются, при малом - дублируются, а обычно происходит и то и другое.
на скриншоте пример работы приложения в фоне, сам штрих-код вводится в блокнот.
scan1.png
scan2.png
Может, кто знает метод получения уникальных символов?
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: перехват клавиатуры

Сообщение Vitekkz88 »

Artem.spb писал(а):Задача: перехватить клавиатурный ввод в параллельном потоке....есть гравировальный станок, его родной софт трогать нельзя. К станку подключён экран (=мышка) и сканер штрих-кодов (=клавиатура). Последний работает в режиме эмуляции клавы
То есть имеем некий софт, написанный для станка. В этом софте есть индикатор, в который вносятся показания от сканера. Сам софт крутится на ПК, который идёт в комплекте со станком. Это всё под виндой работает?
Посмотреть нельзя, по какому интерфейсу взаимодействует сканер и ПК? Сделать перехват на уровне интерфейсов взаимодействия проще. Имеет смысл глянуть API сканера(если есть), не исключено, то он сохраняет показания во временный файл, либо к нему можно подключиться дополнительно. Если связь один к одному( на уровне взаимодействия ПО и сканера нет многопоточности...просто подключился и всё, попытки подключения остальных желающих игнорятся) - то задача сводится к избитой теме:
"Как получить значения из контролов стороннего приложения ?"
А никак(без любви с различным софтом), если это не виндовз-элементы управления. WinSpy не пробовал? Посмотри элементы управления в софте, может они в ActiveX-контейнере сидят.
Artem.spb писал(а):Само собой всякие события и прочие стандартные методы не работают т.к. окно будет свёрнуто, и никаких событий в нём не произойдёт.Вариант распознавания символов с экрана возможен, но пока рассматривается как лёгкое извращение, с которым не стоит связываться (да и доп лицензии на вижн денег стоят).
Зачем Vision? Хочешь взять Vision и с его помощью скрин окна делать+распозновать определенную область на скрине? Это как из пушки по воробьям :crazy: . Вопрос для себя: Vision умеет делать скрин свёрнутого окна приложения? Я не вкурсе, как это на Vision запиливать, для себя хочу узнать. Легче взять OpenCV + winAPI и получить больше профита, но больше заморочек, но больше профита, но больше заморочек, но больше профита.............
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: перехват клавиатуры

Сообщение Artem.spb »

Vitekkz88 писал(а):То есть имеем некий софт, написанный для станка. В этом софте есть индикатор, в который вносятся показания от сканера. Сам софт крутится на ПК, который идёт в комплекте со станком. Это всё под виндой работает?
да, винда
Посмотреть нельзя, по какому интерфейсу взаимодействует сканер и ПК? Сделать перехват на уровне интерфейсов взаимодействия проще. Имеет смысл глянуть API сканера(если есть), не исключено, то он сохраняет показания во временный файл, либо к нему можно подключиться дополнительно.
я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.
А никак(без любви с различным софтом), если это не виндовз-элементы управления. WinSpy не пробовал? Посмотри элементы управления в софте, может они в ActiveX-контейнере сидят.
попробую
Зачем Vision? Хочешь взять Vision и с его помощью скрин окна делать+распозновать определенную область на скрине? Это как из пушки по воробьям :crazy: . Вопрос для себя: Vision умеет делать скрин свёрнутого окна приложения? Я не вкурсе, как это на Vision запиливать, для себя хочу узнать. Легче взять OpenCV + winAPI и получить больше профита, но больше заморочек, но больше профита, но больше заморочек, но больше профита.............
про вижн я написал, что это извращение.
Скрин свёрнутого окна не нужен, основное приложение всегда на верхнем слое, в нём и отображается отсканированный код. Т.е. если заморочиться этим способом, то нужен скрин экрана, в котором в известном месте появляются цифры.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: перехват клавиатуры

Сообщение Blackman »

Поставьте пробник на выходе VI. Нажмите и отпустите клавишу. Будет выводится пустой массив. Т.е. пустой массив является разделителем символов. Отсюда следует что надо иметь скорость ввода гарантирующий повторной ввод символов и не надо их накапливать. Хотя это относится к реальной клаве. Может быть сканер работает по другому?
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: перехват клавиатуры

Сообщение Vitekkz88 »

Artem.spb писал(а):я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.
Понял. На уровне диспетчера устройств сканер обнаруживается как клавиатура. Только сканер имеет имеет, условно, одну кнопку "сканировать". Нажали - команда вызывается, происходит сканирование. Полученные данные отправляются в виде ASCII-символов на верх, декодируются и выводятся. А как они(символы) отправляются? По одному символу или целым блоком?(типа ctrl+c - ctrl+v).
Как это проверить: нужно цепляться снифером между сканером и ПК и смотреть, за сколько транзакций передаются данные. Если интерфейс взаимодействия известен - то сделать не проблема.
Artem.spb писал(а):Скрин свёрнутого окна не нужен, основное приложение всегда на верхнем слое, в нём и отображается отсканированный код.
Тогда можно делать скрин именно окна приложения, зная его HWND(можно сделать скрин и свёрнутого приложения, но там есть свои камни). Выдернуть область с цифрами проще будет, а дальше алгоритм распознования. Приложение(из которого нужно будет выдёргивать картинку) из себя что представляет? Много всякого или просто поле с кодом от сканера?
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: перехват клавиатуры

Сообщение Artem.spb »

Vitekkz88 писал(а):
Artem.spb писал(а):я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.
Понял. На уровне диспетчера устройств сканер обнаруживается как клавиатура. Только сканер имеет имеет, условно, одну кнопку "сканировать". Нажали - команда вызывается, происходит сканирование. Полученные данные отправляются в виде ASCII-символов на верх, декодируются и выводятся. А как они(символы) отправляются? По одному символу или целым блоком?(типа ctrl+c - ctrl+v).
Как это проверить: нужно цепляться снифером между сканером и ПК и смотреть, за сколько транзакций передаются данные. Если интерфейс взаимодействия известен - то сделать не проблема.
мой сниппет показывает, как сделать эту "непроблему".
Судя по всему сканер кидает по одному символу, как будто кто-то шустрый печатает на клавиатуре: опросник выдаёт массивы в 1-2 элемента.
Если бы он давал всё блоком, дублей и потерь не было бы, а так символы могут пропасть (блокнот их выхватывает из буфера раньше, чем LV проверит) или продублироваться (если вторая проверка идёт раньше, чем нужно)
Тогда можно делать скрин именно окна приложения, зная его HWND(можно сделать скрин и свёрнутого приложения, но там есть свои камни). Выдернуть область с цифрами проще будет, а дальше алгоритм распознования. Приложение(из которого нужно будет выдёргивать картинку) из себя что представляет? Много всякого или просто поле с кодом от сканера?
предлагаю обсуждение вариантов принтскринов и распознавания текста пока свернуть, я очень не хочу идти таким путём.
Аватара пользователя
dadreamer

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

Re: перехват клавиатуры

Сообщение dadreamer »

Нужно поставить хук на клаву, но для этого придётся написать небольшую DLL'ку.
SetWindowsHookEx
LowLevelKeyboardProc callback
Hooks Overview
Global keyboard hook with WH_KEYBOARD_LL and keybd_event (windows)
Ну и так далее, эта тема довольно подробно разжёвана на многих ресурсах.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3391
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: перехват клавиатуры

Сообщение Artem.spb »

Blackman писал(а):Поставьте пробник на выходе VI. Нажмите и отпустите клавишу. Будет выводится пустой массив. Т.е. пустой массив является разделителем символов. Отсюда следует что надо иметь скорость ввода гарантирующий повторной ввод символов и не надо их накапливать. Хотя это относится к реальной клаве. Может быть сканер работает по другому?
проглядел гениальное решение. Пусть топорное, но работате. Опрос 2-3 мс, сбоев пока не наблюдал. Спасибо.
Остальные методы пока отложу, т.к. они требуют больше времени
Аватара пользователя
FireFly

Activity Black
expert
expert
Сообщения: 1321
Зарегистрирован: 25 апр 2009, 08:58
Награды: 2
Версия LabVIEW: 2014
Откуда: Санкт-Петербург
Поблагодарили: 1 раз

Re: перехват клавиатуры

Сообщение FireFly »

Можно перевести сканер в режим COM-порта.
Своим софтом работать со сканером по COM-порту.
Если номер ОК - эмулировать печать номера клавиатурой.

Мне кажется такой вариант надежнее и даже немного проще.
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.
Ответить

Вернуться в «Для чайников»