purebasic.info

PureBasic forum
Текущее время: Пн июл 16, 2018 11:30 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Кардридер
СообщениеДобавлено: Пн авг 07, 2017 8:03 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Кто-нибуть работал с кардридерами? Есть у меня простенький кардридер для пластиковых карточек с магнитной лентой.
Изображение
Он определяется системой как клавиатура, сторонние драйвера не нужны, и он спокойно может печатать с карты прямо в блокнот. Задача в том чтобы сделать форму для ввода ключа с карты.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
;- Описание компонента работы с кардридером
CompilerIf Not Defined(PostEventType, #PB_Enumeration) : Enumeration EventType #PB_EventType_FirstCustomValue : EndEnumeration : CompilerEndIf
Enumeration EventType
  #KPP_EventType_CardInput
EndEnumeration
 
Procedure KPP_CardKey_Thread(Gadget)
  Repeat
    Time=GetGadgetData(Gadget)
    If Time : SetGadgetData(Gadget, 0)
      Delay(Time)
    EndIf
  Until Time=0
  PostEvent(#PB_Event_Gadget, 0, Gadget, #KPP_EventType_CardInput)
EndProcedure
 
Procedure KPP_BGE_CardKey()
  Static Thread
 
  Gadget=EventGadget()
  SetGadgetData(Gadget, 500)
 
  If Not IsThread(Thread)
    Thread=CreateThread(@KPP_CardKey_Thread(), Gadget)
  EndIf
EndProcedure
 
;- Реализация окна
Enumeration FormWindow
  #KPP_Window_Login=10
EndEnumeration
 
Enumeration FormGadget
  #KPP_Gadget_CardButton
  #KPP_Gadget_CardKey
EndEnumeration
 
Procedure KPP_BGE_CardLogin()
  CardKey$=GetGadgetText(#KPP_Gadget_CardKey)
  MessageRequester("Ключ карты", CardKey$)
EndProcedure
 
Procedure KPP_BGE_CardButton()
  SetGadgetText(#KPP_Gadget_CardKey, "")
  SetActiveGadget(#KPP_Gadget_CardKey)
EndProcedure  
 
If OpenWindow(#KPP_Window_Login, 0, 0, 200, 100, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ; мой компонент
  StringGadget(#KPP_Gadget_CardKey, 0, 0, 200, 20, "")
  HideGadget(#KPP_Gadget_CardKey, #True)
  BindGadgetEvent(#KPP_Gadget_CardKey, @KPP_BGE_CardKey(), #PB_EventType_Change)
 
  ; Остальные компоненты окна
  ButtonGadget(#KPP_Gadget_CardButton, 0, 80, 200, 20, "Нажмите кнопку и проведите картой")
  BindGadgetEvent(#KPP_Gadget_CardButton, @KPP_BGE_CardButton())
  BindEvent(#PB_Event_Gadget, @KPP_BGE_CardLogin(), 0, #KPP_Gadget_CardKey, #KPP_EventType_CardInput)
 
  Repeat
    Event=WaitWindowEvent()
  Until Event=#PB_Event_CloseWindow
EndIf
 


Главный недостаток в том, что ключ можно легко копировать в буфер обмена и также легко вставить обманывая тем самым систему. Можно запретить копирование/вставку из StringGadget без хуков? Может возможно создание текстового поля без возможности копировать средствами WinAPI? Может можно определить клавиатуру с которой происходит ввод? А может лучше выбросить эту безымянную читалку и купить нормальную со своим API и примерами исходников от производителя? (Такие есть вообще?)


Вложения:
Снимок.PNG [58.61 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Кардридер
СообщениеДобавлено: Пн авг 07, 2017 8:17 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Клавиатура это USB HID. С ней можно соединиться по PID и VID и считывать данные. В сети можно найти формат передачи клавиатуры. http://bascom.at.ua/publ/atomnaja_klavi ... b/1-1-0-54
Цитата:
Следует обратить внимание на формат передаваемого репорта:

' Формат передаваемого репорта - usb_tx_buffer:

_usb_tx_buffer2(2) = 0 ' modifier - комбинация из 8-ми модификаций (левые и правые Ctrl, Alt, Shift, Win)
_usb_tx_buffer2(3) = 0 ' reserved - резерв
_usb_tx_buffer2(4) = 0 ' keycode 0 - код клавиши 0
_usb_tx_buffer2(5) = 0 ' keycode 1 - код клавиши 1
_usb_tx_buffer2(6) = 0 ' keycode 2 - код клавиши 2
_usb_tx_buffer2(7) = 0 ' keycode 3 - код клавиши 3
_usb_tx_buffer2(8) = 0 ' keycode 4 - код клавиши 4
_usb_tx_buffer2(9) = 0 ' keycode 5 - код клавиши 5

' modifier
' bit0 LEFT CTRL (1)
' bit1 LEFT SHIFT (2)
' bit2 LEFT ALT (4)
' bit3 LEFT WIN (8)
' bit4 RIGHT CTRL (16)
' bit5 RIGHT SHIFT (32)
' bit6 RIGHT ALT (64)
' bit7 RIGHT WIN (128)

' CTRL + ALT + DEL
' Эту комбинацию нужно передать так: &H05, &H00, &H4С, &H00, &H00, &H00, &H00, &H00 = 5[Ctrl(1) + Alt(4)], 0, 76, 0, 0, 0, 0, 0
' В первый байт попадает сумма модификаций клавиш (левые и правые Ctrl, Alt, Shift, Win)

Не забывайте после передачи кода клавиши передать в репорт все нули - признак отпускания клавиши!

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Кардридер
СообщениеДобавлено: Пн авг 07, 2017 10:36 pm 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 144
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
А если полученные данные не писать, а рисовать (DrawText())?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Кардридер
СообщениеДобавлено: Пн авг 07, 2017 10:58 pm 
Не в сети
доцент

Зарегистрирован: Ср апр 28, 2010 4:02 pm
Сообщений: 49
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
Пётр писал(а):
С ней можно соединиться по PID и VID и считывать данные.

Чувствую, копать придётся глубоко :? Не до драйверов ли?
КЭС писал(а):
данные не писать, а рисовать

Хитро.Это возможно :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
 
...
Select EventType()
  Case #PB_EventType_Change
    Char=GetEnteredChar()
    Width=ImageWidth(#Image)
    ResizeImage(#Image, Width+1, #PB_Ignore, #PB_Image_Raw)
    StartDrawing(ImageOutput(#Image))
       Plot(Width+1, 1, Char)
    StopDrawing()
...
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Кардридер
СообщениеДобавлено: Вт авг 08, 2017 11:00 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Тигрёнок писал(а):
Чувствую, копать придётся глубоко
Файл HID_Module.pbi можно взять здесь viewtopic.php?f=10&t=4713

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB