реклама на сайте
подробности

 
 
> Положить в буфер клавиатуры, C builder
toweroff
сообщение Jul 21 2016, 06:49
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый день
Ситуация следующая: купили китайский сканер QR кодов. Эти самые коды с русскими символами (сделаны в BarTender)
Китайское чудо работает отлично, распознавание уверенное, но русские символы не понимает. Китаец прислал программку, которая (при переводе сканера в режим COM-порта) садится на этот порт и помещает перекодированные символы в буфер клавиатуры. Но и тут засада - Win CP 1251 там нет и китаец на запрос о поддержке нашей кодировки вообще перестал отвечать на письма
Придется как-то самим... На порт я сяду, а вот работать с клавиатурным буфером не умею. Расскажите, пожалуйста, как это все работает, как определяется фокус ввода (или это клавиатуры никак не касается и приложение само фокус захватывает?)
В общем, буду признателен за ликбез в этой области
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 15)
k155la3
сообщение Jul 21 2016, 08:43
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Давно было, исползовал
Код
  SendMessage(hwnd, WM_CHAR, ' ', 1L);

Для клавиатурных сообщений посмотрите из списка WM_XXXX
т.е. на окно hwnd отправлялось сообщение типа WM_CHAR с данными "пробел".
В Вашем случае (возможно) сделать программу-фильтр в виде "сервиса", которая будет сидеть на компорте,
преобразовывать в "точтонадо" и отсылать сообщения на основную программу.

Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 21 2016, 08:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(k155la3 @ Jul 21 2016, 11:43) *
В Вашем случае (возможно) сделать программу-фильтр в виде "сервиса", которая будет сидеть на компорте,
преобразовывать в "точтонадо" и отсылать сообщения на основную программу.

приложение должно быть любым - у кого сейчас фокус ввода, тот и принял эти символы. Нет фокуса - так и фиг с ними. Короче говоря - полный аналог клавиатуры нужен sm.gif
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Jul 21 2016, 09:01
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Я другого не понял, при чем сканер и кодировка.

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

Опыт автоматизации большой, но сканеры ни когда не подключал в разрыв клавиатуры (хотя все сканеры поддерживали такой тип подключения).

PS я к тому, что в разрыв клавиатуры сканер должен посылать скан коды символов, попробуйте подключить непосредственно к COM порту и посмотреть, что он посылает.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 21 2016, 09:21
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(toweroff @ Jul 21 2016, 11:50) *
приложение должно быть любым - у кого сейчас фокус ввода, тот и принял эти символы. Нет фокуса - так и фиг с ними. Короче говоря - полный аналог клавиатуры нужен sm.gif


Если задача "разовая", в стиле "сделать надежно и забыть".
Я делал халтурку. В платформенных весах вышел из строя весовой контроллер, который работал в примитивном протоколе по RS232.
Контроллер весов был подключен на COM PC, далее инф шла в 1С (через свой "драйвер", который понимал протокл сгорелого вес-контроллера).
Купили новый контроллер, кажется Rinstrrum, со своим протоколом.

Решение.
В PC была воткнута 2-портовая плата RS232 NMOS.
2 потрта этой платы были включены "в разрыв" соединения нового вес-контроллера и PC.
(получился такой себе "типа шлюз").
Программная поддержка сводилась к конвертации протокола нового вес-контроллера к протоколу "сгорелого", который понимала 1C.

ps - А аппаратный интерфейс у китайского девайса какой - RS232 или USB ?


Сообщение отредактировал k155la3 - Jul 21 2016, 09:24
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 21 2016, 11:03
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(SlavaV @ Jul 21 2016, 12:01) *
Я другого не понял, при чем сканер и кодировка.

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

Опыт автоматизации большой, но сканеры ни когда не подключал в разрыв клавиатуры (хотя все сканеры поддерживали такой тип подключения).

PS я к тому, что в разрыв клавиатуры сканер должен посылать скан коды символов, попробуйте подключить непосредственно к COM порту и посмотреть, что он посылает.

сканер работает в одном из двух режимов - Keyboard HID или USB-COM
в режиме клавиатуры вместо русских символов - полная хрень, поэтому нужно в режиме порта ловить то, что от него приходит, перекодировать в Win CP1251 и эмулировать клавиатурные нажатия

Цитата(k155la3 @ Jul 21 2016, 12:21) *
ps - А аппаратный интерфейс у китайского девайса какой - RS232 или USB ?

USB
работает в одном из двух режимов - выше указал
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Jul 21 2016, 12:35
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Драйвера в режиме клавиатуры китайские или стандартные?

В режиме COM подключитесь терминалом (putty и т.д.) посмотрите, что он шлет реальные данные или перекодированные.

Если сами программу разрабатываете поймайте отладчиком строку перед выводом в "поле вывода" и опять-же сравнить с реально закодированными данными.

PS думаю, что "поле ввода" конвертирует в какой-нибудь unicode (я просто на VC++ разрабатываю так там черт ногу сломит с этими вариантами типов данных поддержки Unicode)
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 21 2016, 13:33
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(SlavaV @ Jul 21 2016, 15:35) *
Драйвера в режиме клавиатуры китайские или стандартные?

В режиме COM подключитесь терминалом (putty и т.д.) посмотрите, что он шлет реальные данные или перекодированные.

Если сами программу разрабатываете поймайте отладчиком строку перед выводом в "поле вывода" и опять-же сравнить с реально закодированными данными.

PS думаю, что "поле ввода" конвертирует в какой-нибудь unicode (я просто на VC++ разрабатываю так там черт ногу сломит с этими вариантами типов данных поддержки Unicode)

драйвер клавиатуры стандартный
в режиме COM-порта шлёт сырец, знаки препинания, англ.буквы, цифры - одним байтом, как есть
русские символы передаются двухбайтовой посылкой, начинаются с 0x84
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Jul 21 2016, 13:38
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



думаю тогда нужно менять программу формирования QR кодов. моё мнение должно быть всё или однобайтовое (ASCII) или всё двухбайтовое (Unicode)
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 21 2016, 13:54
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Я не понял, что имеется ввиду под "фокус ввода".
Это:
1 - в разрезе системы в целом ( любое открытое приложение, например Word или Notepad, при получении фокуса получает китай-QR вывод),
или
2 - в разрезе Вашего приложения, Вашей разработки (несколько форм-диалогов, и ввод в них),
или
3 - одно приложение не Вашей разработки (те без доступа к исх. коду)

Ps - около года назад юзал функции из этой оперы, вот
раздел Win32API, возможно Вам поможет.

MSDN_Keyboard
Код
MapVirtualKey()
    - Translates (maps) a virtual-key code into a scan code or
    character value, or translates a scan code into a virtual-key code.

    To specify a handle to the keyboard layout to use for translating the
    specified code, use the MapVirtualKeyEx function.

MapVirtualKeyEx()
    - Maps a virtual-key code into a scan code or character value,
    or translates a scan code into a virtual-key code.
    The function translates the codes using the input language and
    an input locale identifier.


SendInput()
    -  Synthesizes keystrokes, mouse motions, and button clicks.


Сообщение отредактировал k155la3 - Jul 21 2016, 15:04
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 21 2016, 15:36
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(k155la3 @ Jul 21 2016, 16:54) *
Я не понял, что имеется ввиду под "фокус ввода".
Это:
1 - в разрезе системы в целом ( любое открытое приложение, например Word или Notepad, при получении фокуса получает китай-QR вывод),

оно самое

Цитата(k155la3 @ Jul 21 2016, 16:54) *
раздел Win32API, возможно Вам поможет.

спасибо, буду изучать

Цитата(SlavaV @ Jul 21 2016, 16:38) *
думаю тогда нужно менять программу формирования QR кодов

BarTender - это данность. В любом случае, смартфон читает нормально то, что им напечатано
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 22 2016, 03:00
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(toweroff @ Jul 21 2016, 14:50) *
приложение должно быть любым - у кого сейчас фокус ввода, тот и принял эти символы. Нет фокуса - так и фиг с ними. Короче говоря - полный аналог клавиатуры нужен sm.gif

Если "приложение должно быть любым", то никакие SendMessage, WM_CHAR, WM_KEYDOWN и т.п. не подойдут. Так как у разных приложений разный способ приёма событий клавиатуры. С одними приложениями будет работать, с другими - нет.
Подойдёт BlockInput/SendInput - они работают с системным буфером событий мыши/клавы. Курите MSDN на этот счёт.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 26 2016, 08:22
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(jcxz @ Jul 22 2016, 06:00) *
Если "приложение должно быть любым", то никакие SendMessage, WM_CHAR, WM_KEYDOWN и т.п. не подойдут. Так как у разных приложений разный способ приёма событий клавиатуры. С одними приложениями будет работать, с другими - нет.
Подойдёт BlockInput/SendInput - они работают с системным буфером событий мыши/клавы. Курите MSDN на этот счёт.

спасибо, работает
НО! (куда ж без него? sm.gif )
Переключать Верхний-нижний регистры я могу, а вот раскладку клавиатуры - нет
Если пользоваться LoadKeyboardLayout, то раскладка переключается для приложения, которое и выполняет эту функцию, а не для того, у которого фокус в данный момент
и, я так понимаю, напрямую влезть в буфер клавиатуры никак, только через генерацию системных событий нажатия/отпускания клавиши sad.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 26 2016, 12:18
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(toweroff @ Jul 26 2016, 14:22) *
Переключать Верхний-нижний регистры я могу, а вот раскладку клавиатуры - нет
Если пользоваться LoadKeyboardLayout, то раскладка переключается для приложения, которое и выполняет эту функцию, а не для того, у которого фокус в данный момент
и, я так понимаю, напрямую влезть в буфер клавиатуры никак, только через генерацию системных событий нажатия/отпускания клавиши sad.gif

Так и генерите соответствующую комбинацию нажатий переключения раскладки через этот же SendInput.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 26 2016, 12:32
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Кмк с генерацией именно русских символов лучший вариант комбинация ALT+<код символа>. Например ALT+134 эквивалентно "Ж". https://ru.wikipedia.org/wiki/Alt-%D0%BA%D0%BE%D0%B4 Проблема в том что на линукс/макос способ ввода/коды другие, но судя по контексту билдера это не важно.
ЗЫ А вообще смотрю на SendInput - там же вроде описана возможность напрямую слать юникод. Разве не работает?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jul 26 2016, 13:33
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Kabdim @ Jul 26 2016, 15:32) *
Разве не работает?

Работает, спасибо
а то я уж в дебри какие-то полез sm.gif
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 00:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01526 секунд с 7
ELECTRONIX ©2004-2016