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

 

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

         实现思路:我用的是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

转载于:https://www.cnblogs.com/qqhfeng/archive/2011/08/26/2155009.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值