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

news/2024/7/8 11:29:02

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

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

 

 





http://www.niftyadmin.cn/n/3655722.html

相关文章

适应安装程序用的TreeView控件

对axTree做了大量的修改&#xff0c;一是修改Bug&#xff0c;二是添加新功能1、增加了必选项功能2、支持1616的图标位图3、修改连接线的Bug&#xff0c;增加上虚线补齐功能4、支持API 滚动条&#xff0c;调整滚动条的功能为整体滚动

微软核心模块shell32.dll的应用

没有想到shell32.dll还隐藏着很多实用的功能函数&#xff0c;比如打开文件夹&#xff0c;查找电脑&#xff0c;最小化所有窗体等等&#xff0c;这个shell32.dll既是一个标准的COM&#xff0c;还是一个可以作为普通的DLL进行函数引用。****************************************…

如何在VS2005中自动添加事件处理函数?

用惯了VB6&#xff0c;VC6&#xff0c;一时不知道如何在VS2005添加事件了&#xff0c;看了看参考书和上网查了些资料&#xff0c;都没有查到所需要的&#xff0c;除了在界面双击相应控件自动添加简单的消息外&#xff0c;一时只能手动添加消息。其实&#xff0c;一试才知道&…

用API实现串口异步读写

VB的MSCOMM控件虽然很好用&#xff0c;但是在没有装VB的机器上用该控件总觉得有些累赘&#xff0c;网上的VB API代码大部分都基于是同步方式&#xff0c;处理复杂的通信模式不是太理想&#xff0c;所以用了一些时间&#xff0c;把VC项目中的异步串口读写代码翻译为VB格式。在VB…

2006年中国国际机器人展览会在京召开

2006年中国国际机器人展览会经科技部批准&#xff0c;将于2006年10月11日~13日在北京国际会议中心召开论坛网址&#xff1a;http://www.robotdiy.com/phpbb2/index.php 展会介绍随着中国机器人产业的迅猛发展&#xff0c;据预测到2010年&#xff0c;市场容量将超过93.1亿人民币…

隧道广告系统数据下载相关技术简介

目前隧道广告系统又进行了升级&#xff0c;有原来的256色&#xff0c;192256分辨率&#xff0c;升级为16位色&#xff0c;640320分辨率的新型设备系统&#xff0c;除了硬件大幅度升级改进外&#xff0c;软件也进行了大幅度的改进。1、下载的数据量激增&#xff0c;由原来的单帧…

复活节彩蛋

在我们常用的软件当中隐藏了一些小东东&#xff0c;这些小东东我们称之为复活节彩蛋&#xff08;Easter Eggs&#xff09;。复活节彩蛋的内容包含得很广&#xff0c;从单纯地列出开发人员名单到3D影音游戏都有。我们常用的软件如Windows、Word和Excel以及我们用来上网的浏览器I…

读.net精简框架集所想到的

随着了解.net的深入&#xff0c;越来越感觉到微软的强大&#xff0c;也越来越感觉到他们构建的.net平台的优美&#xff0c;有一种预感&#xff0c;感觉在不远的将来工厂、商店、家庭、学校等等场所都编织成一种网&#xff0c;一种互为依赖&#xff0c;互为发展的网&#xff08;…