powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Считывание магнитных карт (пропуска)
12 сообщений из 12, страница 1 из 1
Считывание магнитных карт (пропуска)
    #39012706
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Система Win7, считыватель магнитных карт «Реверс 1 USB». Видимо, что-то китайское.
Из документации на считыватель только паспорт, драйвер и программа "РеверсСТАРТ".
После установки драйвера и программы появляется порт COM3, а также устройство ввода HID.
Из настроек - только выбор номера порта.
Считыватель выдает код карты в активное окно Windows.
Если активен, к примеру, MS Word или MS Excel, то код в нем появляется.
Визуально 8 символов без перевода строки.
А вот VFP9 на считывание не реагирует. Никак.
Интересно, в чем причина и куда копать?
Попытка читать COM3 как файл приводит к зависанию при чтении.
Неизвестно, что из него надо ждать вообще.
PS. Прочел похожие темы по поводу сканеров штрихкодов, там настраивали
сканеры. А тут как бы настраивать нечего. Или я что-то не знаю.
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39012918
alextashk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s_gonch,

А блокнот как оеагирует?

Судя по Вашему описанию сканер просто выдает в систему считанный код как символы введённые с клавиатуры. Можно попробывать повторить ввод в word в момент записи макроса и посмотреть какая команда ввела код.

Vfp не реагирует.
Какой элемент Vfp в этот момент активен? Command window или text?
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39013092
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alextashks_gonch,

А блокнот как оеагирует?

Судя по Вашему описанию сканер просто выдает в систему считанный код как символы введённые с клавиатуры. Можно попробывать повторить ввод в word в момент записи макроса и посмотреть какая команда ввела код.

Vfp не реагирует.
Какой элемент Vfp в этот момент активен? Command window или text?

Да, как бы с клавиатуры вводятся символы. Запись макроса ничего не дает, при считывании карты появляется строка символов, Эксель ждет завершения ввода, после нажатия Enter в макросе вижу, что ячейке присвоено значение.
VFP - в командном окне ?Inkey(0,"M") на срабатывание считки не реагирует. На форме в текстбокс ничего не вводится.
В системе процессор командной строки (или как там правильно назвать CMD) тоже на считку не реагирует. Как бы в буфер клавиатуры ничего не пишется.
Пошел другим путем. Через MSCOMM пытаюсь читать порт COM3. В паспорте на считку нашел скорость обмена 19200,
поставил в настройки порта "19200,n,8,1". В onComm() вижу, что приходит при считывании 5 байт, но это имхо бинарные данные, не символы, в отладчике видны как набор кракозябр.
Где-то в инете вчера ночью видел, как с помощью MSCOMM принять данные, сейчас опять буду искать.
Если не найду - буду спрашивать. Если получится, через MSCOMM будет даже удобнее, более управляемо, что-ли.
PS. В диспетчере устройств порт COM3 виден как "Silicon labs CP210x USB to UART Bridge (COM3)"
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39013132
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s_gonch,

Судя по ответу Microsoft у тебя все работает, только прочитать не можешь. Посмотри вложение - у нас есть модуль обработки прокси-карт, это его библиотека. Там вроде ничего такого нет.

Вызов из формы:

thisform.proximity1.read()
new_idpr=thisform.proximity1.value

И все работает
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39013133
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s_gonch,
Рподон, вложить забыл
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39013143
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
glamis,

Спасибо, посмотрю чуть позже...
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39013167
glamis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s_gonch,

там как-раз mscom
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39013189
s_gonch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
glamis,

Все, спасибо, вопрос считаю закрытым.
Поставил режим .InputMode=1 (Binary) и все получилось.
Код карты читается правильно.
Почему VFP не ловит то, что идет в активное окно, осталось загадкой (для меня).
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39019102
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток.

Не буду выносить свой вопрос в отдельную тему.
Считыватель Smartech, USB. В любое активное окно считывает номер карточки.
В Fox, соответственно, тоже. Считанный номер (как я понял) заканчивается символом абзаца.
Со считыванием в активное окно проблем нет.

Вопрос: а как быть если окно неактивно (далее сугубо женская фраза) а мне надо.
Как затолкать считанный номер в неактивное окно?
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39019282
T1gRa_NT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тупо в лоб может так:
Считывать в невидимое поле активного окна, и через переменную из этого поля передавать в другое?
Но это приемлемо если окна всегда одни и теже.
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39019402
ArDo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тупо в лоб не получается.
К сожалению.
Ситуация такова:
На рабочей станции установлен считыватель и крутится программка которая анализирует, чего считано. По результатам: проверки, расчеты, отчеты и т.п. Параллельно крутятся другие программы, в частности офис и программа видеонаблюдения. оператор за этим рабочим местом (если он в текущий момент времени есть) и тот кто осуществляет считывание это 2 разных человека.
Какое окно активно на момент считывания непредсказуемо.

Как заставить неактивную программу считать данные с USB?

Более простой вопрос как узнать откуда данные пришли?
...
Рейтинг: 0 / 0
Считывание магнитных карт (пропуска)
    #39145976
Djamshid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ArDo, Как вариант следующий код
LOCAL oForm As RawInputMonitorForm
oForm = CREATEOBJECT("RawInputMonitorForm")
oForm.Visible=.T.
READ EVENTS
* end of main

DEFINE CLASS RawInputMonitorForm As Form
Caption="Raw Input Monitor"
Autocenter=.T.
Width=500
Height=200
ShowWindow=2

ADD OBJECT Label1 As Label WITH;
Left=12, Top=10, Autosize=.T.,;
Caption="Open another Windows application and start typing in..."

ADD OBJECT txtInput As EditBox WITH;
Left=10, Top=36, Width=480, Height=140

ADD OBJECT InputDeviceMgr As RawInputDeviceManager

PROCEDURE Destroy
CLEAR EVENTS

PROCEDURE InputDeviceMgr.OnKbdRawInput(lForeground As Boolean)
IF m.lForeground
* the VFP app is in foreground;
* avoiding double input registering
RETURN 1 && WM_INPUT not processed
ENDIF

ThisForm.txtInput.SetFocus

* just a basic input processing
* one may choose storing the raw input
WITH THIS
IF .kbdAsciiCode > 0
DO CASE
CASE .kbdAsciiCode = 8
KEYBOARD "{BACKSPACE}"
OTHERWISE
KEYBOARD CHR(.kbdAsciiCode)
ENDCASE
ELSE
DO CASE
CASE .kbdVKey = 46
KEYBOARD "{DEL}"
ENDCASE
ENDIF
ENDWITH
RETURN 0 && WM_INPUT processed

ENDDEFINE

DEFINE CLASS RawInputDeviceManager As Custom
#DEFINE GWL_WNDPROC -4
#DEFINE WM_INPUT 0x00ff
#DEFINE RIDEV_INPUTSINK 0x00000100
#DEFINE RIM_INPUT 0
#DEFINE RIM_INPUTSINK 1
#DEFINE RID_HEADER 0x10000005
#DEFINE RID_INPUT 0x10000003
#DEFINE RIM_TYPEMOUSE 0
#DEFINE RIM_TYPEKEYBOARD 1
#DEFINE RIM_TYPEHID 2
#DEFINE RAWINPUTDEVICE_SIZE 12
#DEFINE RAWINPUTHEADER_SIZE 16
#DEFINE RAWINPUT_KEYBOARD_SIZE 32

PROTECTED devices, hOrigProc
devices=NULL
hWindow=0
hOrigProc=0

* RAWINPUTHEADER Structure
dwType=0
dwSize=0
hDevice=0
wParam=0

* RAWKEYBOARD Structure
kbdMakeCode=0
kbdFlags=0
kbdVKey=0
kbdMessage=0
kbdExtraInformation=0

kbdAsciiCode=0

PROCEDURE Init
WITH THIS
.declare
.devices = CREATEOBJECT("RawInputDevices")
.hWindow = ThisForm.HWnd
DOEVENTS

* add keyboard device type
.devices.AddDevice(1, 6, RIDEV_INPUTSINK, .hWindow)
.RegisterDevices
ENDWITH

PROCEDURE hWindow_ASSIGN( nHWnd As Number )
WITH THIS
.hWindow = m.nHWnd
.hOrigProc = GetWindowLong(.hWindow, GWL_WNDPROC)
ENDWITH

PROCEDURE Destroy
IF THIS.hWindow <> 0
= UNBINDEVENTS(THIS.hWindow)
ENDIF

PROCEDURE RegisterDevices
LOCAL nResult, nPointer, cBuffer

cBuffer = THIS.devices.ToString()

* registers raw input devices
* with this application
nResult = RegisterRawInputDevices(;
@cBuffer, THIS.devices.Count,;
RAWINPUTDEVICE_SIZE)

IF VERSION(5) >= 900 && VFP9+
= BINDEVENT( THIS.hWindow, WM_INPUT,;
THIS, "WindowProc" )
ENDIF

PROCEDURE WindowProc(hWindow as Integer, nMsgID as Integer,;
wParam as Integer, lParam as Integer)
* requires VFP9, otherwise ignored
LOCAL nReturn
nReturn=0

DO CASE
CASE nMsgID = WM_INPUT
* wParam: 0=app in foreground, 1=app not in foreground
* lParam: a handle to the RAWINPUT structure
IF THIS.ProcessRawInput( m.lParam )
nReturn = THIS.OnKbdRawInput( wParam=0 )
ELSE
nReturn=1 && WM_INPUT not processed
ENDIF

IF m.nReturn <> 0
nReturn = CallWindowProc(;
THIS.hOrigProc, THIS.hWindow,;
m.nMsgID, m.wParam, m.lParam)
ENDIF

OTHERWISE
* pass control to the original window procedure
nReturn = CallWindowProc(THIS.hOrigProc, THIS.hWindow,;
m.nMsgID, m.wParam, m.lParam)
ENDCASE
RETURN nReturn

PROCEDURE OnKbdRawInput(lForeground As Boolean)
* lForeground - the form is in foreground
* a placeholder
RETURN 1 && WM_INPUT not processed

PROCEDURE ProcessRawInput(hRawinput As Number)
LOCAL nBufsize, cHeader, cRawdata

*!* nBufsize=0
*!* GetRawInputData(m.hRawinput, RID_INPUT,;
*!* NULL, @nBufsize, RAWINPUTHEADER_SIZE)

nBufsize=RAWINPUT_KEYBOARD_SIZE
cRawdata = REPLICATE(CHR(0), nBufsize)

= GetRawInputData(m.hRawinput, RID_INPUT,;
@cRawdata, @nBufsize, RAWINPUTHEADER_SIZE)

WITH THIS
.dwType = buf2dword(SUBSTR(m.cRawdata,1,4))
.dwSize = buf2dword(SUBSTR(m.cRawdata,5,4))
.hDevice = buf2dword(SUBSTR(m.cRawdata,9,4))
.wParam = buf2dword(SUBSTR(m.cRawdata,13,4))

IF .dwType = RIM_TYPEKEYBOARD
.kbdFlags = buf2word(SUBSTR(m.cRawdata,19,2))

* Process keystrokes on KeyDown
IF INLIST(.kbdFlags, 0, 2)
.kbdMakeCode = buf2word(SUBSTR(m.cRawdata,17,2))
.kbdVKey = buf2word(SUBSTR(m.cRawdata,23,2))
.kbdMessage = buf2dword(SUBSTR(m.cRawdata,25,4))
.kbdExtraInformation = buf2dword(SUBSTR(m.cRawdata,29,4))

.kbdAsciiCode = VKeyToASCII(;
.kbdVKey, .kbdMakeCode )
RETURN .T.
ENDIF
ENDIF
ENDWITH
RETURN .F.

PROCEDURE declare
DECLARE INTEGER GetLastError IN kernel32

DECLARE INTEGER GetWindowLong IN user32;
INTEGER hWindow, INTEGER nIndex

DECLARE INTEGER CallWindowProc IN user32;
INTEGER lpPrevWndFunc, INTEGER hWindow,;
LONG Msg, INTEGER wParam, INTEGER lParam

DECLARE INTEGER RegisterRawInputDevices IN user32;
STRING @pRawInputDevices, LONG uiNumDevices,;
LONG cbSize

DECLARE INTEGER GetRawInputData IN user32;
INTEGER hRawInput, LONG uiCommand,;
STRING @pData, LONG @pcbSize,;
LONG cbSizeHeader

DECLARE INTEGER GetKeyboardState IN user32;
STRING @lpKeyState

DECLARE INTEGER MapVirtualKey IN user32;
LONG uCode, LONG uMapType

DECLARE INTEGER ToAscii IN user32;
LONG uVirtKey, LONG uScanCode,;
STRING @lpKeyState, INTEGER @lpChar,;
LONG uFlags

ENDDEFINE

DEFINE CLASS RawInputDevices As Collection

PROCEDURE AddDevice( usUsagePage As Number,;
usUsage As Number, dwFlags As Number,;
hWindow As Number)

LOCAL cDeviceBuffer

cDeviceBuffer = num2word(m.usUsagePage) +;
num2word(m.usUsage) + num2dword(m.dwFlags) +;
num2dword(m.hWindow)

THIS.Add( m.cDeviceBuffer )

FUNCTION ToString() As String
LOCAL cBuffer, cDeviceBuffer
cBuffer=""
FOR EACH cDeviceBuffer IN THIS
cBuffer = m.cBuffer + m.cDeviceBuffer
NEXT
RETURN m.cBuffer

ENDDEFINE

************** library functions **************

FUNCTION VKeyToASCII( nVirtKey As Number,;
nScanCode As Number ) As Number
* converts virtual key to ASCII code
nAsciiCode=0
cKeyboardState = REPLICATE(CHR(0), 256)
GetKeyboardState( @cKeyboardState )

= ToAscii( m.nVirtKey, nScanCode,;
@cKeyboardState, @nAsciiCode, 0)

RETURN m.nAsciiCode

FUNCTION buf2dword(cBuffer)
RETURN Asc(SUBSTR(cBuffer, 1,1)) + ;
BitLShift(Asc(SUBSTR(cBuffer, 2,1)), 8) +;
BitLShift(Asc(SUBSTR(cBuffer, 3,1)), 16) +;
BitLShift(Asc(SUBSTR(cBuffer, 4,1)), 24)

FUNCTION buf2word(lcBuffer)
RETURN Asc(SUBSTR(lcBuffer, 1,1)) + ;
Asc(SUBSTR(lcBuffer, 2,1)) * 256

FUNCTION num2dword(lnValue)
#DEFINE m0 0x0000100
#DEFINE m1 0x0010000
#DEFINE m2 0x1000000
IF lnValue < 0
lnValue = 0x100000000 + lnValue
ENDIF
LOCAL b0, b1, b2, b3
b3 = Int(lnValue/m2)
b2 = Int((lnValue - b3*m2)/m1)
b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)

FUNCTION num2word(lnValue)
RETURN Chr(MOD(m.lnValue,256)) + CHR(INT(m.lnValue/256))
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Считывание магнитных карт (пропуска)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]