Перейти к содержанию
    

Положить в буфер клавиатуры

Добрый день

Ситуация следующая: купили китайский сканер QR кодов. Эти самые коды с русскими символами (сделаны в BarTender)

Китайское чудо работает отлично, распознавание уверенное, но русские символы не понимает. Китаец прислал программку, которая (при переводе сканера в режим COM-порта) садится на этот порт и помещает перекодированные символы в буфер клавиатуры. Но и тут засада - Win CP 1251 там нет и китаец на запрос о поддержке нашей кодировки вообще перестал отвечать на письма

Придется как-то самим... На порт я сяду, а вот работать с клавиатурным буфером не умею. Расскажите, пожалуйста, как это все работает, как определяется фокус ввода (или это клавиатуры никак не касается и приложение само фокус захватывает?)

В общем, буду признателен за ликбез в этой области

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давно было, исползовал

  SendMessage(hwnd, WM_CHAR, ' ', 1L);

Для клавиатурных сообщений посмотрите из списка WM_XXXX

т.е. на окно hwnd отправлялось сообщение типа WM_CHAR с данными "пробел".

В Вашем случае (возможно) сделать программу-фильтр в виде "сервиса", которая будет сидеть на компорте,

преобразовывать в "точтонадо" и отсылать сообщения на основную программу.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Вашем случае (возможно) сделать программу-фильтр в виде "сервиса", которая будет сидеть на компорте,

преобразовывать в "точтонадо" и отсылать сообщения на основную программу.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Если задача "разовая", в стиле "сделать надежно и забыть".

Я делал халтурку. В платформенных весах вышел из строя весовой контроллер, который работал в примитивном протоколе по RS232.

Контроллер весов был подключен на COM PC, далее инф шла в 1С (через свой "драйвер", который понимал протокл сгорелого вес-контроллера).

Купили новый контроллер, кажется Rinstrrum, со своим протоколом.

 

Решение.

В PC была воткнута 2-портовая плата RS232 NMOS.

2 потрта этой платы были включены "в разрыв" соединения нового вес-контроллера и PC.

(получился такой себе "типа шлюз").

Программная поддержка сводилась к конвертации протокола нового вес-контроллера к протоколу "сгорелого", который понимала 1C.

 

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

 

Изменено пользователем k155la3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

сканер работает в одном из двух режимов - Keyboard HID или USB-COM

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

 

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

USB

работает в одном из двух режимов - выше указал

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

драйвер клавиатуры стандартный

в режиме COM-порта шлёт сырец, знаки препинания, англ.буквы, цифры - одним байтом, как есть

русские символы передаются двухбайтовой посылкой, начинаются с 0x84

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

думаю тогда нужно менять программу формирования QR кодов. моё мнение должно быть всё или однобайтовое (ASCII) или всё двухбайтовое (Unicode)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не понял, что имеется ввиду под "фокус ввода".

Это:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не понял, что имеется ввиду под "фокус ввода".

Это:

1 - в разрезе системы в целом ( любое открытое приложение, например Word или Notepad, при получении фокуса получает китай-QR вывод),

оно самое

 

раздел Win32API, возможно Вам поможет.

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

 

думаю тогда нужно менять программу формирования QR кодов

BarTender - это данность. В любом случае, смартфон читает нормально то, что им напечатано

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если "приложение должно быть любым", то никакие SendMessage, WM_CHAR, WM_KEYDOWN и т.п. не подойдут. Так как у разных приложений разный способ приёма событий клавиатуры. С одними приложениями будет работать, с другими - нет.

Подойдёт BlockInput/SendInput - они работают с системным буфером событий мыши/клавы. Курите MSDN на этот счёт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если "приложение должно быть любым", то никакие SendMessage, WM_CHAR, WM_KEYDOWN и т.п. не подойдут. Так как у разных приложений разный способ приёма событий клавиатуры. С одними приложениями будет работать, с другими - нет.

Подойдёт BlockInput/SendInput - они работают с системным буфером событий мыши/клавы. Курите MSDN на этот счёт.

спасибо, работает

НО! (куда ж без него? :) )

Переключать Верхний-нижний регистры я могу, а вот раскладку клавиатуры - нет

Если пользоваться LoadKeyboardLayout, то раскладка переключается для приложения, которое и выполняет эту функцию, а не для того, у которого фокус в данный момент

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переключать Верхний-нижний регистры я могу, а вот раскладку клавиатуры - нет

Если пользоваться LoadKeyboardLayout, то раскладка переключается для приложения, которое и выполняет эту функцию, а не для того, у которого фокус в данный момент

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

Так и генерите соответствующую комбинацию нажатий переключения раскладки через этот же SendInput.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кмк с генерацией именно русских символов лучший вариант комбинация ALT+<код символа>. Например ALT+134 эквивалентно "Ж". https://ru.wikipedia.org/wiki/Alt-%D0%BA%D0%BE%D0%B4 Проблема в том что на линукс/макос способ ввода/коды другие, но судя по контексту билдера это не важно.

ЗЫ А вообще смотрю на SendInput - там же вроде описана возможность напрямую слать юникод. Разве не работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...