Совсем не чайниковский вопрос, но в другие темы тоже не подходит.
На NI форуме начался какой-то бред, может у меня с английским что-то не то, так что попробую по-русски.
Задача: перехватить клавиатурный ввод в параллельном потоке.
Если надо подробности, то есть гравировальный станок, его родной софт трогать нельзя.
К станку подключён экран (=мышка) и сканер штрих-кодов (=клавиатура). Последний работает в режиме эмуляции клавы, т.е. он именно клавиатура, а не что-то в ком-порте.
Оператор ставит изделие в установку, сканирует штрих-код (он высвечивается на экране), нажимает кнопку «поехали» и всё.
Хочется перед запуском гравирования убедиться, что этот код есть в базе, т.е. изделие прошло тестирование. Если нет, вывести предупреждение, что гравировать не стоит. Каких-то супер блокировок не требуется.
Вариант распознавания символов с экрана возможен, но пока рассматривается как лёгкое извращение, с которым не стоит связываться (да и доп лицензии на вижн денег стоят).
Само собой всякие события и прочие стандартные методы не работают т.к. окно будет свёрнуто, и никаких событий в нём не произойдёт.
Нашёл вариант опроса клавиатуры, но он работает нестабильно. При большом периоде опроса символы теряются, при малом - дублируются, а обычно происходит и то и другое.
на скриншоте пример работы приложения в фоне, сам штрих-код вводится в блокнот.
Может, кто знает метод получения уникальных символов?
перехват клавиатуры
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: перехват клавиатуры
То есть имеем некий софт, написанный для станка. В этом софте есть индикатор, в который вносятся показания от сканера. Сам софт крутится на ПК, который идёт в комплекте со станком. Это всё под виндой работает?Artem.spb писал(а):Задача: перехватить клавиатурный ввод в параллельном потоке....есть гравировальный станок, его родной софт трогать нельзя. К станку подключён экран (=мышка) и сканер штрих-кодов (=клавиатура). Последний работает в режиме эмуляции клавы
Посмотреть нельзя, по какому интерфейсу взаимодействует сканер и ПК? Сделать перехват на уровне интерфейсов взаимодействия проще. Имеет смысл глянуть API сканера(если есть), не исключено, то он сохраняет показания во временный файл, либо к нему можно подключиться дополнительно. Если связь один к одному( на уровне взаимодействия ПО и сканера нет многопоточности...просто подключился и всё, попытки подключения остальных желающих игнорятся) - то задача сводится к избитой теме:
"Как получить значения из контролов стороннего приложения ?"
А никак(без любви с различным софтом), если это не виндовз-элементы управления. WinSpy не пробовал? Посмотри элементы управления в софте, может они в ActiveX-контейнере сидят.
Зачем Vision? Хочешь взять Vision и с его помощью скрин окна делать+распозновать определенную область на скрине? Это как из пушки по воробьям . Вопрос для себя: Vision умеет делать скрин свёрнутого окна приложения? Я не вкурсе, как это на Vision запиливать, для себя хочу узнать. Легче взять OpenCV + winAPI и получить больше профита, но больше заморочек, но больше профита, но больше заморочек, но больше профита.............Artem.spb писал(а):Само собой всякие события и прочие стандартные методы не работают т.к. окно будет свёрнуто, и никаких событий в нём не произойдёт.Вариант распознавания символов с экрана возможен, но пока рассматривается как лёгкое извращение, с которым не стоит связываться (да и доп лицензии на вижн денег стоят).
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 173 раза
- Контактная информация:
Re: перехват клавиатуры
да, виндаVitekkz88 писал(а):То есть имеем некий софт, написанный для станка. В этом софте есть индикатор, в который вносятся показания от сканера. Сам софт крутится на ПК, который идёт в комплекте со станком. Это всё под виндой работает?
я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.Посмотреть нельзя, по какому интерфейсу взаимодействует сканер и ПК? Сделать перехват на уровне интерфейсов взаимодействия проще. Имеет смысл глянуть API сканера(если есть), не исключено, то он сохраняет показания во временный файл, либо к нему можно подключиться дополнительно.
попробуюА никак(без любви с различным софтом), если это не виндовз-элементы управления. WinSpy не пробовал? Посмотри элементы управления в софте, может они в ActiveX-контейнере сидят.
про вижн я написал, что это извращение.Зачем Vision? Хочешь взять Vision и с его помощью скрин окна делать+распозновать определенную область на скрине? Это как из пушки по воробьям . Вопрос для себя: Vision умеет делать скрин свёрнутого окна приложения? Я не вкурсе, как это на Vision запиливать, для себя хочу узнать. Легче взять OpenCV + winAPI и получить больше профита, но больше заморочек, но больше профита, но больше заморочек, но больше профита.............
Скрин свёрнутого окна не нужен, основное приложение всегда на верхнем слое, в нём и отображается отсканированный код. Т.е. если заморочиться этим способом, то нужен скрин экрана, в котором в известном месте появляются цифры.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: перехват клавиатуры
Поставьте пробник на выходе VI. Нажмите и отпустите клавишу. Будет выводится пустой массив. Т.е. пустой массив является разделителем символов. Отсюда следует что надо иметь скорость ввода гарантирующий повторной ввод символов и не надо их накапливать. Хотя это относится к реальной клаве. Может быть сканер работает по другому?
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: перехват клавиатуры
Понял. На уровне диспетчера устройств сканер обнаруживается как клавиатура. Только сканер имеет имеет, условно, одну кнопку "сканировать". Нажали - команда вызывается, происходит сканирование. Полученные данные отправляются в виде ASCII-символов на верх, декодируются и выводятся. А как они(символы) отправляются? По одному символу или целым блоком?(типа ctrl+c - ctrl+v).Artem.spb писал(а):я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.
Как это проверить: нужно цепляться снифером между сканером и ПК и смотреть, за сколько транзакций передаются данные. Если интерфейс взаимодействия известен - то сделать не проблема.
Тогда можно делать скрин именно окна приложения, зная его HWND(можно сделать скрин и свёрнутого приложения, но там есть свои камни). Выдернуть область с цифрами проще будет, а дальше алгоритм распознования. Приложение(из которого нужно будет выдёргивать картинку) из себя что представляет? Много всякого или просто поле с кодом от сканера?Artem.spb писал(а):Скрин свёрнутого окна не нужен, основное приложение всегда на верхнем слое, в нём и отображается отсканированный код.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 173 раза
- Контактная информация:
Re: перехват клавиатуры
мой сниппет показывает, как сделать эту "непроблему".Vitekkz88 писал(а):Понял. На уровне диспетчера устройств сканер обнаруживается как клавиатура. Только сканер имеет имеет, условно, одну кнопку "сканировать". Нажали - команда вызывается, происходит сканирование. Полученные данные отправляются в виде ASCII-символов на верх, декодируются и выводятся. А как они(символы) отправляются? По одному символу или целым блоком?(типа ctrl+c - ctrl+v).Artem.spb писал(а):я писал, что сканер эмулирует клаву. Если открыть блокнот и отсканировать код, то в блокноте "напечатается" строка.
Как это проверить: нужно цепляться снифером между сканером и ПК и смотреть, за сколько транзакций передаются данные. Если интерфейс взаимодействия известен - то сделать не проблема.
Судя по всему сканер кидает по одному символу, как будто кто-то шустрый печатает на клавиатуре: опросник выдаёт массивы в 1-2 элемента.
Если бы он давал всё блоком, дублей и потерь не было бы, а так символы могут пропасть (блокнот их выхватывает из буфера раньше, чем LV проверит) или продублироваться (если вторая проверка идёт раньше, чем нужно)
предлагаю обсуждение вариантов принтскринов и распознавания текста пока свернуть, я очень не хочу идти таким путём.Тогда можно делать скрин именно окна приложения, зная его HWND(можно сделать скрин и свёрнутого приложения, но там есть свои камни). Выдернуть область с цифрами проще будет, а дальше алгоритм распознования. Приложение(из которого нужно будет выдёргивать картинку) из себя что представляет? Много всякого или просто поле с кодом от сканера?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: перехват клавиатуры
Нужно поставить хук на клаву, но для этого придётся написать небольшую DLL'ку.
SetWindowsHookEx
LowLevelKeyboardProc callback
Hooks Overview
Global keyboard hook with WH_KEYBOARD_LL and keybd_event (windows)
Ну и так далее, эта тема довольно подробно разжёвана на многих ресурсах.
SetWindowsHookEx
LowLevelKeyboardProc callback
Hooks Overview
Global keyboard hook with WH_KEYBOARD_LL and keybd_event (windows)
Ну и так далее, эта тема довольно подробно разжёвана на многих ресурсах.
-
- professor
- Сообщения: 3404
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 173 раза
- Контактная информация:
Re: перехват клавиатуры
проглядел гениальное решение. Пусть топорное, но работате. Опрос 2-3 мс, сбоев пока не наблюдал. Спасибо.Blackman писал(а):Поставьте пробник на выходе VI. Нажмите и отпустите клавишу. Будет выводится пустой массив. Т.е. пустой массив является разделителем символов. Отсюда следует что надо иметь скорость ввода гарантирующий повторной ввод символов и не надо их накапливать. Хотя это относится к реальной клаве. Может быть сканер работает по другому?
Остальные методы пока отложу, т.к. они требуют больше времени
-
FireFly
- expert
- Сообщения: 1321
- Зарегистрирован: 25 апр 2009, 08:58
- Награды: 2
- Версия LabVIEW: 2014
- Откуда: Санкт-Петербург
- Поблагодарили: 1 раз
Re: перехват клавиатуры
Можно перевести сканер в режим COM-порта.
Своим софтом работать со сканером по COM-порту.
Если номер ОК - эмулировать печать номера клавиатурой.
Мне кажется такой вариант надежнее и даже немного проще.
Своим софтом работать со сканером по COM-порту.
Если номер ОК - эмулировать печать номера клавиатурой.
Мне кажется такой вариант надежнее и даже немного проще.
Иногда лучше молчать и слыть идиотом, чем заговорить и развеять все сомнения.