USB口的红外条形码扫描器的另类使用

简介:         目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果没有输入焦点,或另一个不相干的程序获得输入焦点,那就有点乱套了。

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

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

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

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

form1 中的代码:

' *************************************************************************
'
**模 块 名:frmDemo
'
**说    明:YFsoft 版权所有2006 - 2007(C)
'
**创 建 人:叶帆 http://blog.csdn.net/yefanqiu
'
**日    期:2006-08-30 14:55:56
'
**修 改 人:
'
**日    期:
'
**描    述:
'
**版    本:V1.0.0
'
*************************************************************************
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
'
**说    明:YFsoft 版权所有2006 - 2007(C)
'
**创 建 人:叶帆 http://blog.csdn.net/yefanqiu
'
**日    期:2006-08-30 15:02:29
'
**修 改 人:
'
**日    期:
'
**描    述:获取条形码数据
'
**版    本: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
'
**输    入:无
'
**输    出:无
'
**功能描述:装卸钩子
'
**全局变量:
'
**调用模块:
'
**作    者:叶帆
'
**日    期:2006-08-30 15:11:37
'
**修 改 人:
'
**日    期:
'
**版    本: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) -
'
**功能描述:获取扫描码
'
**全局变量:
'
**调用模块:
'
**作    者:叶帆
'
**日    期:2006-08-30 16:46:04
'
**修 改 人:
'
**日    期:
'
**版    本: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) -
'
**功能描述:
'
**全局变量:
'
**调用模块:
'
**作    者:叶帆
'
**日    期:2006-08-30 15:03:47
'
**修 改 人:
'
**日    期:
'
**版    本: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
    
    frmDemo.lblTime 
=  g_BarCode.Time
End Sub

 

 

相关文章
|
5月前
|
芯片 SoC 内存技术
全志H713红外IR遥控配置方法
这篇文章详细介绍了全志H713芯片平台配置红外遥控器的方法,包括获取遥控器规格、NEC协议的配置步骤、其他IR协议配置以及解决头码配置问题的方法。
188 5
全志H713红外IR遥控配置方法
|
传感器 芯片
可编程 USB 转串口适配器开发板与振弦传感器测量模块
当通过 IIC 接口修改 VM5xx 单个寄存器后,被修改的寄存器立即保存(断电不丢失),但连续寄存器的写入仅当时修改生效,模块重启后会自动恢复。为了能够使寄存器永久保存,可以单独向功能寄存器 03 写入指令码 0x000C 来强制保存所有寄存器。
可编程 USB 转串口适配器开发板与振弦传感器测量模块
|
编解码 缓存 物联网
工程监测NLM5无线中继采集发送仪安装电池及数字接口
NLM5xx是一台低功耗的多通道无线中继采集仪,得益于传感测量、无线通讯、功耗控制等技术累积,设备平均功耗低至微安级别。内置电池可独立工作数年。 1 安装电池/连接电源 NLM5xx 使用内置电池和(或)外部电源工作。可以仅安装 1~3 节 14500 型锂电池,或者仅使用外部供电,也可以内置电池和外部供电同时存在,此时 NLM5xx 的电能完全来自外部电源,同时外部电源也为内置电池充电。
|
传感器
工程监测多通道振弦模拟信号采集仪VTN的MODBUS 通讯协议
在 MODBUS 协议下,所有寄存器被定义为“保持寄存器” (详见 MODBUS 通讯协议标准说明), 设备支持基于 MODBUS 协议的多个连续寄存器读取、单个寄存器写入两种指令码, 对应指令码分别为 0x03、 0x06。
工程监测多通道振弦模拟信号采集仪VTN的MODBUS 通讯协议
|
传感器 网络协议 数据中心
多通道振弦传感器无线采发仪远程修改参数详解
无线采集仪支持远程无线修改设备参数功能,可通过短信指令、 FTP 文件、 TCP 在线指令三种途径实现。 参数修改指令需要参数地址值,参数地址可由配置工具 SETP 获取,方法是点击工具界面中的任意一个参数的【读取】按钮,点击后,在界面左侧的指令发送文本框内会出现形如“ $GETP=AAA#”的指令码,其中的 AAA就是此参数的地址值。
多通道振弦传感器无线采发仪远程修改参数详解
|
传感器
工程监测多通道振弦模拟信号采集仪VTN的MODBUS通讯协议详解
在 MODBUS 协议下,所有寄存器被定义为“保持寄存器” (详见 MODBUS 通讯协议标准说明), 设备支持基于 MODBUS 协议的多个连续寄存器读取、单个寄存器写入两种指令码, 对应指令码分别为 0x03、 0x06。
工程监测多通道振弦模拟信号采集仪VTN的MODBUS通讯协议详解
|
传感器 存储
多功能手持VH501TC采集仪连接传感器与读数
振弦与温度传感器 振弦传感器和温度传感器(NTC)均为无源传感,不需要连接电源线。 根据前述“设备组成和接口定义” 用对应颜色的鳄鱼夹分别连接振弦传感器线圈和温度传感器两端即可。传感器连接后,屏幕自动显示实时的测量结果。一般情况下,设备配套传感测线为一根 4 芯线,红黑线连接振弦线圈,另外两根连接温度传感器。
多功能手持VH501TC采集仪连接传感器与读数
|
传感器 芯片
可编程 USB 转串口适配器开发板与振弦采集模块测量模块
VM501/511振弦采集模块 是稳控科技生产的振弦传感器测量模块,具有IIC 接口和 UART 接口。
可编程 USB 转串口适配器开发板与振弦采集模块测量模块
|
传感器 存储
手持采集仪VH501TC如何连接各种传感器
4线制电子标签传感器 DSensor DSensor 专门研发的包含有传感器型号和计算参数的一体化传感器,可实时获取传感器型号、类型、量程、初始频率、计算参数等信息,当读数仪检测到电子标签传感器接入时,界面自动切换,显示传感器的基本信息和计算结果,计算结果以物理量形式显示。 红黑线连接振弦线圈,黄色连接电子标签正极,蓝色连接电子标签负极。
手持采集仪VH501TC如何连接各种传感器
|
数据格式
智能车常用的上下位机:匿名上位机 V7,TFMiniPlus 激光雷达测距
智能车常用的上下位机:匿名上位机 V7,TFMiniPlus 激光雷达测距
255 0