|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
Система Win7, считыватель магнитных карт «Реверс 1 USB». Видимо, что-то китайское. Из документации на считыватель только паспорт, драйвер и программа "РеверсСТАРТ". После установки драйвера и программы появляется порт COM3, а также устройство ввода HID. Из настроек - только выбор номера порта. Считыватель выдает код карты в активное окно Windows. Если активен, к примеру, MS Word или MS Excel, то код в нем появляется. Визуально 8 символов без перевода строки. А вот VFP9 на считывание не реагирует. Никак. Интересно, в чем причина и куда копать? Попытка читать COM3 как файл приводит к зависанию при чтении. Неизвестно, что из него надо ждать вообще. PS. Прочел похожие темы по поводу сканеров штрихкодов, там настраивали сканеры. А тут как бы настраивать нечего. Или я что-то не знаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2015, 19:53 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
s_gonch, А блокнот как оеагирует? Судя по Вашему описанию сканер просто выдает в систему считанный код как символы введённые с клавиатуры. Можно попробывать повторить ввод в word в момент записи макроса и посмотреть какая команда ввела код. Vfp не реагирует. Какой элемент Vfp в этот момент активен? Command window или text? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2015, 04:40 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
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)" ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2015, 10:34 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
s_gonch, Судя по ответу Microsoft у тебя все работает, только прочитать не можешь. Посмотри вложение - у нас есть модуль обработки прокси-карт, это его библиотека. Там вроде ничего такого нет. Вызов из формы: thisform.proximity1.read() new_idpr=thisform.proximity1.value И все работает ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2015, 10:56 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
s_gonch, Рподон, вложить забыл ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2015, 10:57 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
glamis, Спасибо, посмотрю чуть позже... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2015, 11:06 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
s_gonch, там как-раз mscom ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2015, 11:20 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
glamis, Все, спасибо, вопрос считаю закрытым. Поставил режим .InputMode=1 (Binary) и все получилось. Код карты читается правильно. Почему VFP не ловит то, что идет в активное окно, осталось загадкой (для меня). ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2015, 11:40 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
Всем доброго времени суток. Не буду выносить свой вопрос в отдельную тему. Считыватель Smartech, USB. В любое активное окно считывает номер карточки. В Fox, соответственно, тоже. Считанный номер (как я понял) заканчивается символом абзаца. Со считыванием в активное окно проблем нет. Вопрос: а как быть если окно неактивно (далее сугубо женская фраза) а мне надо. Как затолкать считанный номер в неактивное окно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2015, 21:52 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
Тупо в лоб может так: Считывать в невидимое поле активного окна, и через переменную из этого поля передавать в другое? Но это приемлемо если окна всегда одни и теже. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2015, 10:13 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
Тупо в лоб не получается. К сожалению. Ситуация такова: На рабочей станции установлен считыватель и крутится программка которая анализирует, чего считано. По результатам: проверки, расчеты, отчеты и т.п. Параллельно крутятся другие программы, в частности офис и программа видеонаблюдения. оператор за этим рабочим местом (если он в текущий момент времени есть) и тот кто осуществляет считывание это 2 разных человека. Какое окно активно на момент считывания непредсказуемо. Как заставить неактивную программу считать данные с USB? Более простой вопрос как узнать откуда данные пришли? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.07.2015, 11:43 |
|
Считывание магнитных карт (пропуска)
|
|||
---|---|---|---|
#18+
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)) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.01.2016, 23:10 |
|
|
start [/forum/topic.php?fid=41&fpage=20&tid=1582188]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 152ms |
0 / 0 |