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

Простейшие вопросы в области инженерной разработки

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

Postby Artem.spb on 21 Aug 2017, 10:08

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

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

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

scan1.png

scan2.png


Может, кто знает метод получения уникальных символов?
Artem.spb
expert
expert
 
Posts: 1210
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

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

Postby Vitekkz88 on 21 Aug 2017, 12:27

Artem.spb писал(а):Задача: перехватить клавиатурный ввод в параллельном потоке....есть гравировальный станок, его родной софт трогать нельзя. К станку подключён экран (=мышка) и сканер штрих-кодов (=клавиатура). Последний работает в режиме эмуляции клавы

То есть имеем некий софт, написанный для станка. В этом софте есть индикатор, в который вносятся показания от сканера. Сам софт крутится на ПК, который идёт в комплекте со станком. Это всё под виндой работает?
Посмотреть нельзя, по какому интерфейсу взаимодействует сканер и ПК? Сделать перехват на уровне интерфейсов взаимодействия проще. Имеет смысл глянуть API сканера(если есть), не исключено, то он сохраняет показания во временный файл, либо к нему можно подключиться дополнительно. Если связь один к одному( на уровне взаимодействия ПО и сканера нет многопоточности...просто подключился и всё, попытки подключения остальных желающих игнорятся) - то задача сводится к избитой теме:
"Как получить значения из контролов стороннего приложения ?"
А никак(без любви с различным софтом), если это не виндовз-элементы управления. WinSpy не пробовал? Посмотри элементы управления в софте, может они в ActiveX-контейнере сидят.

Artem.spb писал(а):Само собой всякие события и прочие стандартные методы не работают т.к. окно будет свёрнуто, и никаких событий в нём не произойдёт.Вариант распознавания символов с экрана возможен, но пока рассматривается как лёгкое извращение, с которым не стоит связываться (да и доп лицензии на вижн денег стоят).

Зачем Vision? Хочешь взять Vision и с его помощью скрин окна делать+распозновать определенную область на скрине? Это как из пушки по воробьям :crazy: . Вопрос для себя: Vision умеет делать скрин свёрнутого окна приложения? Я не вкурсе, как это на Vision запиливать, для себя хочу узнать. Легче взять OpenCV + winAPI и получить больше профита, но больше заморочек, но больше профита, но больше заморочек, но больше профита.............
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 942
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 258
hardware I/O VIP

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

Postby Artem.spb on 21 Aug 2017, 12:36

Vitekkz88 wrote:То есть имеем некий софт, написанный для станка. В этом софте есть индикатор, в который вносятся показания от сканера. Сам софт крутится на ПК, который идёт в комплекте со станком. Это всё под виндой работает?

да, винда

Посмотреть нельзя, по какому интерфейсу взаимодействует сканер и ПК? Сделать перехват на уровне интерфейсов взаимодействия проще. Имеет смысл глянуть API сканера(если есть), не исключено, то он сохраняет показания во временный файл, либо к нему можно подключиться дополнительно.

я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.

А никак(без любви с различным софтом), если это не виндовз-элементы управления. WinSpy не пробовал? Посмотри элементы управления в софте, может они в ActiveX-контейнере сидят.

попробую

Зачем Vision? Хочешь взять Vision и с его помощью скрин окна делать+распозновать определенную область на скрине? Это как из пушки по воробьям :crazy: . Вопрос для себя: Vision умеет делать скрин свёрнутого окна приложения? Я не вкурсе, как это на Vision запиливать, для себя хочу узнать. Легче взять OpenCV + winAPI и получить больше профита, но больше заморочек, но больше профита, но больше заморочек, но больше профита.............

про вижн я написал, что это извращение.
Скрин свёрнутого окна не нужен, основное приложение всегда на верхнем слое, в нём и отображается отсканированный код. Т.е. если заморочиться этим способом, то нужен скрин экрана, в котором в известном месте появляются цифры.
Artem.spb
expert
expert
 
Posts: 1210
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

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

Postby Blackman on 21 Aug 2017, 12:39

Поставьте пробник на выходе VI. Нажмите и отпустите клавишу. Будет выводится пустой массив. Т.е. пустой массив является разделителем символов. Отсюда следует что надо иметь скорость ввода гарантирующий повторной ввод символов и не надо их накапливать. Хотя это относится к реальной клаве. Может быть сканер работает по другому?
Blackman
leader
leader
 
Posts: 673
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 166

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

Postby Vitekkz88 on 21 Aug 2017, 13:02

Artem.spb писал(а):я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.

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

Тогда можно делать скрин именно окна приложения, зная его HWND(можно сделать скрин и свёрнутого приложения, но там есть свои камни). Выдернуть область с цифрами проще будет, а дальше алгоритм распознования. Приложение(из которого нужно будет выдёргивать картинку) из себя что представляет? Много всякого или просто поле с кодом от сканера?
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 942
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 258
hardware I/O VIP

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

Postby Artem.spb on 21 Aug 2017, 13:21

Vitekkz88 wrote:
Artem.spb писал(а):я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.

Понял. На уровне диспетчера устройств сканер обнаруживается как клавиатура. Только сканер имеет имеет, условно, одну кнопку "сканировать". Нажали - команда вызывается, происходит сканирование. Полученные данные отправляются в виде ASCII-символов на верх, декодируются и выводятся. А как они(символы) отправляются? По одному символу или целым блоком?(типа ctrl+c - ctrl+v).
Как это проверить: нужно цепляться снифером между сканером и ПК и смотреть, за сколько транзакций передаются данные. Если интерфейс взаимодействия известен - то сделать не проблема.

мой сниппет показывает, как сделать эту "непроблему".
Судя по всему сканер кидает по одному символу, как будто кто-то шустрый печатает на клавиатуре: опросник выдаёт массивы в 1-2 элемента.
Если бы он давал всё блоком, дублей и потерь не было бы, а так символы могут пропасть (блокнот их выхватывает из буфера раньше, чем LV проверит) или продублироваться (если вторая проверка идёт раньше, чем нужно)

Тогда можно делать скрин именно окна приложения, зная его HWND(можно сделать скрин и свёрнутого приложения, но там есть свои камни). Выдернуть область с цифрами проще будет, а дальше алгоритм распознования. Приложение(из которого нужно будет выдёргивать картинку) из себя что представляет? Много всякого или просто поле с кодом от сканера?

предлагаю обсуждение вариантов принтскринов и распознавания текста пока свернуть, я очень не хочу идти таким путём.
Artem.spb
expert
expert
 
Posts: 1210
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

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

Postby dadreamer on 21 Aug 2017, 14:05

Нужно поставить хук на клаву, но для этого придётся написать небольшую DLL'ку.
SetWindowsHookEx
LowLevelKeyboardProc callback
Hooks Overview
Global keyboard hook with WH_KEYBOARD_LL and keybd_event (windows)
Ну и так далее, эта тема довольно подробно разжёвана на многих ресурсах.
User avatar
dadreamer
doctor
doctor
 
Posts: 2859
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 704
I/O VIP vision internet

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

Postby Artem.spb on 21 Aug 2017, 14:39

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


проглядел гениальное решение. Пусть топорное, но работате. Опрос 2-3 мс, сбоев пока не наблюдал. Спасибо.
Остальные методы пока отложу, т.к. они требуют больше времени
Artem.spb
expert
expert
 
Posts: 1210
Joined: 31 Jul 2011, 23:05
Medals: 2
Activity (1) Автор (1)
LabVIEW Version: 12,14,15
Karma: 213
CLD hardware I/O VIP freelance

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

Postby FireFly on 29 Aug 2017, 10:30

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

Мне кажется такой вариант надежнее и даже немного проще.
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.
User avatar
FireFly
expert
expert
 
Posts: 1313
Joined: 25 Apr 2009, 08:58
Medals: 2
Activity (1) Black (1)
LabVIEW Version: 2014
Karma: 169


Return to Для чайников

Who is online

Users browsing this forum: Bing [Bot], Google, Yahoo and 11 guests

cron