USB口的条形码扫描器接口编程(VB) 转

目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果没有输入焦点,或另一个不相干的程序获得输入焦点,那就有点乱套了。我想实现的是,不管什么情况,只要扫描器一工作,我的程序就能自动激活,并能获得当前输入的条形码信息。

实现思路:我用的USB口的条形码扫描器,仔细分析了一下,扫描成功后,以键盘按键消息的形式把条形码输入信息通知给系统。这样通过键盘钩子就可以方便的获得该信息了。但是,怎样区分信息是键盘还是条形码输入的哪?

很简单,条形码扫描器在很短的时间内输入了至少3个字符以上信息,并且以“回车”作为结束字符,在这种思想指引下,很完美的实现了预定功能。

以下程序要在Win2000/Win XP 下才能运行成功。

form1 中的代码:

‘*************************************************************************

Option Explicit

Private Sub Form_Load()
   SetHook
End Sub

Private Sub Form_Unload(Cancel As Integer)
   UnHook
End Sub

Private Sub tmrScan_Timer()
    Dim strBarCode As String
    strBarCode = GetBarCode
    If Len(strBarCode) > 0 Then
        MsgBox "条形码:" & strBarCode
    End If
End Sub
模块中的代码:

‘*************************************************************************
‘**模 块 名:basBarCode
‘**描    述:获取条形码数据
‘**版    本:V1.0.0
‘*************************************************************************
Option Explicit

Private Type KeyboardBytes
    kbByte(0 To 255) As Byte
End Type
Dim kbArray As KeyboardBytes

Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As KeyboardBytes) As Long
Private Declare Function ToAscii Lib "user32" (ByVal uVirtKey As Long, ByVal uScanCode As Long, lpbKeyState As KeyboardBytes, lpwTransKey As Long, ByVal fuState As Long) As Long

Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Private Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long

Private Type EVENTMSG
    message As Long
    paramL As Long
    paramH As Long
    Time As Long
    hwnd As Long
End Type

Private Type BARCODES
    VirtKey As Long         ‘虚拟码
    ScanCode As Long           ‘扫描码
    KeyName As String       ‘键的名称
    AscII As Long           ‘AscII
    Chr As String           ‘字符
   
    BarCode As String      ‘扫描码信息
    Time As Date            ‘扫描时间
    bGetFlag As Boolean     ‘是否已获取扫描码
End Type

Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function GetCurrentTime Lib "kernel32" Alias "GetTickCount" () As Long

Private Const WH_KEYBOARD_LL = 13
Private m_lHook As Long
Public g_BarCode As BARCODES

‘*************************************************************************
‘**函 数 名:SetHook / UnHook
‘**输    入:无
‘**输    出:无
‘**功能描述:装卸钩子
‘**全局变量:
‘**调用模块:
‘**版    本:V1.0.0
‘*************************************************************************
Public Sub SetHook()
    m_lHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallHookProc, App.hInstance, 0)
End Sub

Public Sub UnHook()
    If m_lHook <> 0 Then
        UnhookWindowsHookEx m_lHook
    End If
End Sub

‘*************************************************************************
‘**函 数 名:GetBarCode
‘**输    入:无
‘**输    出:(String) -
‘**功能描述:获取扫描码
‘**全局变量:
‘**调用模块:
‘**版    本:V1.0.0
‘*************************************************************************
Public Function GetBarCode() As String
    If g_BarCode.bGetFlag = True Then
        g_BarCode.bGetFlag = False
        GetBarCode = g_BarCode.BarCode
    Else
        GetBarCode = ""
    End If
End Function

‘*************************************************************************
‘**函 数 名:CallHookProc
‘**输    入:ByVal code(Long)   -
‘**        :ByVal wParam(Long) -
‘**        :ByVal lParam(Long) -
‘**输    出:(Long) -
‘**功能描述:
‘**全局变量:
‘**调用模块:
‘**版    本:V1.0.0
‘*************************************************************************
Private Function CallHookProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim msg As EVENTMSG
    Dim strKeyName As String
    Dim lngKey As Long
    Static lngTime As Long
    Static strBarCode As String

If code = 0 Then
        CopyMemory msg, lParam, LenB(msg)
        If wParam = &H100 Then   ‘WM_KEYDOWN
            g_BarCode.VirtKey = msg.message And &HFF           ‘虚拟码
            g_BarCode.ScanCode = msg.paramL And &HFF              ‘扫描码
           
            strKeyName = Space(255)
            If GetKeyNameText(g_BarCode.ScanCode * 65536, strKeyName, 255) > 0 Then  ‘键名
                g_BarCode.KeyName = Trim(strKeyName)
            Else
                g_BarCode.KeyName = ""
            End If

‘---------------------------------------
            Call GetKeyboardState(kbArray)
            If ToAscii(g_BarCode.VirtKey, g_BarCode.ScanCode, kbArray, lngKey, 0) > 0 Then
                g_BarCode.AscII = lngKey
                g_BarCode.Chr = Chr(lngKey)
            End If

‘--------------------
            If Abs(GetCurrentTime - lngTime) > 50 Then
                strBarCode = g_BarCode.Chr
            Else
                If (msg.message And &HFF) = 13 And Len(strBarCode) > 3 Then ‘回车
                    g_BarCode.BarCode = strBarCode
                    g_BarCode.Time = Now
                    g_BarCode.bGetFlag = True
                End If
                strBarCode = strBarCode & g_BarCode.Chr
            End If
            lngTime = GetCurrentTime
            ‘---------------------------------------
            ‘测试代码
            ’Call ShowKeyInfo
            ‘---------------------------------------
        End If

End If

CallHookProc = CallNextHookEx(m_lHook, code, wParam, lParam)
End Function

‘显示调试信息
Public Sub ShowKeyInfo()
    frmDemo.txtKey(0) = g_BarCode.KeyName
    frmDemo.txtKey(1) = g_BarCode.VirtKey
    frmDemo.txtKey(2) = g_BarCode.ScanCode

frmDemo.txtKey(3) = g_BarCode.AscII
    frmDemo.txtKey(4) = g_BarCode.Chr
    frmDemo.txtBarCode = g_BarCode.BarCode

时间: 2024-10-11 11:39:51

USB口的条形码扫描器接口编程(VB) 转的相关文章

将手机micro USB口转换为USB type C连接器的低成本方案

我们知道USB IF提出的type C连接器的终极目标是统一各种USB 接口. 尽管USB 3.0在PC市场上发展的风生水起,但是由于USB 3.0对手机4G LTE的EMI和RFI干扰,导致市场上除了三星手机具有USB 3.0接口外,其他厂商都因为无法解决USB 3.0对手机RF的EMI和RFI干扰而对之束之高阁. 倘若要实现type C接口的完整功能,需要Cable Detect IC的协助,而CD功能一般是集成到USB PD芯片中,由于目前USB PD芯片市场上种类比较少并且价格昂贵,考虑

通过USB口扩展wan口上网(4G上网卡)

通过USB口扩展wan口上网(4G上网卡) 一.前言 现爱快可支持通过USB口扩展wan口上网,不再居于地点的限制,随时随地流畅上网. 二.具体配置 现在有两种设备可以实现通过USB口转化为wan口上网,一是4G上网卡(已知支持型号:华为E8372,华为E5573s-853,中兴MF79S),二是手机USB共享 4G上网卡需配合上网卡托插入路由器USB接口 手机直接通过数据线连接到USB口上 这样连接之后爱快上就会多出来一块网卡,将此网卡绑定成为wan口,选择DHCP的上网方式,获取到地址之后即

[yueqian_scut]蓝牙防丢器原理、实现与Android BLE接口编程

本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与Android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内部源码实现,笔者以后再详细剖析.但要求读者对BLE协议有一定的认识,如GAP.GATTprofile在BLE中的角色和作用,如何使用Service.Characteristic等. 一.蓝牙防丢器原理和产品需求 蓝牙防丢器的核心原理是根据接收到的蓝牙设备端的无线信号强度(RSSI)来估算距离.其计算

面向接口编程

系列——MEF实现设计上的“松耦合”(终结篇:面向接口编程) 序:忙碌多事的八月带着些许的倦意早已步入尾声,金秋九月承载着抗战胜利70周年的喜庆扑面而来.没来得及任何准备,似乎也不需要任何准备,因为生活不需要太多将来时.每天忙着上班.加班.白加班,忘了去愤,忘了去算计所谓的价值.天津爆炸事故时刻警示着我们生命的无常,逝者安息,活着的人生活还得继续,珍惜生命,远离伤害.武汉,这座炙热的城市,虽值金秋,却依然经受着“秋老虎”的烘烤,马路上蒸腾的热气迎面袭来,全身毛孔张开,汗流不止,在这般高温下,似乎

mybatis--面向接口编程

如果使用hiberante作为dao层,常用的方式是:定义一个dao层接口包(com.dao.service)然后在定义一个dao层接口实现包(com.dao.service.impl),这样定义结构清晰,方便维护和开发工作.如果使用mybatis作为dao层,我们就可以省略到dao实现包,直接将sql实现在xml配置文件中编写,这样维护起来更方便了! 首先将mybatis整合到spring中: <!-- define the SqlSessionFactory --> <bean id

Hibernate(八)__级联操作、struts+hibernate+接口编程架构

级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个department ,那么就自动删除该部门的所有学生. 再比如: bbs项目主帖<---->回帖 , 把主帖删除,那我们就希望把该主帖的回帖自动删除,这样我们可以使用级联(cascade)操作. 案例:如何配置级联操作,当删除某个部门的时候,我们自动删除其学生. 首先我们在配置文件中修改: <

那些年搞不懂的高深术语——依赖倒置?控制反转?依赖注入?面向接口编程

那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些“高深术语”感到过困扰.也许时至今日,你仍对它们一知半解.不过就在今天,这一切都将彻底改变!我将带领你以一种全新的高清视角进入奇妙的编程世界,领略涵泳在这些“高深术语”中的活泼泼的地气,以及翩跹于青萍之末的云水禅心. ·内聚 内聚,通俗的来讲,就是自己的东西自己保管,自己的事情自己做. 经典理论告诉我们,程序的两大要素:一个是数据(data),一个是操作(opration).而 PASCA

java面向接口编程

在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有什么优点呢? 这种优点大大的.比方说我们声明一个car的接口.我们对车有下面行为,我们能够开车.洗车,推车,修车,拆车等等, 详细用代码实现: package com.panther.dong.faceinterface; /** * Created by panther on 15-8-9. */

Spring中di配合接口编程

一:DI基本概念 依赖注入(DI),是spring容器实现的基础,在spring-core模块中实现的.所谓DI,就是指对象是被动接受依赖类而不是自己主动去找,换句话说就是指对象不是从容器中查找它依赖的类,而是在容器实例化对象的时候主动将它依赖的类注入给它. DI作用: di配合接口编程,的确可以减少层(web层) 和 业务层的耦合度. 二:DI配合接口编程案例 1.项目截图 2.基本代码 package com.cloud.inter; public interfaceChangeLetter