【Access源码】判断是否扫码枪输入的通用函数源码分享-红尘如烟
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> Access数据库-模块/函数/VBA


【Access源码】判断是否扫码枪输入的通用函数源码分享

发表时间:2019/2/28 11:21:19 评论(3) 浏览(9124)  评论 | 加入收藏 | 复制
   
摘 要:翻到曾经的一个存货,做了一些修改和完善分享出来给大家参考,有用得到的人请自取。
正 文:

现在在仓库管理,超市贩售等场合,扫码枪等扫码输入设备已经成了必不可少的工具,基本上不再需要人工去输入商品编码了。


那么我们在用Access开发软件时,能和扫码枪结合使用吗?答案是肯定的。实际上绝大部分扫码枪的原理,都是用的模拟键盘输入,也就是说只要能用键盘,扫码枪就能用。但你用Access开发的软件不能用键盘吗?绝对不可能嘛!


是否扫码枪扫码输入判别原理:

由于很多扫码枪是通过模拟键盘的方式进行输入,因此难以直接从输入来源判断。但是因为扫描输入间隔短而规律,手工输入间隔长短不一,所以通过判断按键之间的间隔时间来判断,是相对可行和可靠的方案。


在本示例中,我将基于此原理的判断功能封装为一个通用的函数 IsScannerInput 方便大家调用。


如果你对VBA编程完全熟悉了,可以直接看下面的函数源代码即可,当然也可以下载文末的示例附件。


函数源码:

'Win32API函数声明
'获取开机到现在过去的时间(此Win32 API函数可以精确到毫秒数)
Public Declare Function ApiGetTime Lib "winmm.dll" Alias "timeGetTime" () As Long 
'========================================================================================
'函数名称: IsScannerInput
'用途说明: 用于判断是否使用扫码枪等扫描设备输入。在输入框KeyDown事件中调用。
'输入参数: KeyCode          输入框KeyDown事件的KeyCode参数,传址调用。
'           KeyPressInterval 扫描设备输入时两次按键的最大间隔时间。
'           RepeatCount      连续按键次数,通过判断连续多次的按键间隔时间,以增加准确度。
'           EndKeyCode       扫描设备输入结束标志字符,一般情况下默认是回车键,但在设备上
'                            应该是可以通过跳线或开关进行设置的。
'返 回 值: 当捕获到输入结束标志字符(一般是回车)时,如果前面RepeatCount个字符的输入间隔
'           满足,则返回True,否则返回False。
'作    者: 红尘如烟 2012-02-14
'修    改: 红尘如烟 2019-01-23
'注意事项: 很多扫描枪是通过模拟键盘的方式进行输入,因此难以直接从输入来源判断。此函数的判
'           断原理,是通过判断按键之间的间隔,扫描输入间隔短而规律,手工输入间隔长短不一。
'========================================================================================
Public Function IsScannerInput _
    ( _
          ByRef KeyCode As Integer _
        , Optional KeyPressInterval As Long = 100 _
        , Optional RepeatCount As Long = 5 _
        , Optional EndKeyCode As Integer = vbKeyReturn _
    ) As Boolean
    Static slngKeyPressTime(255) As Long
    IsScannerInput = False
    slngKeyPressTime(RepeatCount - 1) = slngKeyPressTime(RepeatCount)
    slngKeyPressTime(RepeatCount) = ApiGetTime()
    Dim lngI As Long
    For lngI = 1 To RepeatCount - 2
        slngKeyPressTime(lngI) = slngKeyPressTime(lngI + 1)
    Next
    If KeyCode = EndKeyCode Then
        Dim blnScanMode As Boolean: blnScanMode = True
        For lngI = 1 To RepeatCount - 1
            If slngKeyPressTime(lngI + 1) - slngKeyPressTime(lngI) > KeyPressInterval Then
                blnScanMode = False
                Exit For
            End If
        Next
        If blnScanMode Then
            KeyCode = 0
            IsScannerInput = True
        End If
    End If
End Function

附   件:

点击下载示例附件



Access软件网交流QQ群(群号:198465573)
 
 相关文章
用access控制扫描仪,摄像头  【蒋震宇  2008/7/1】
非接触式ic卡读卡器的操作  【在水一方  2016/4/18】
【Access示例】二维码\二维码的使用\QRmaker控件   【缪炜  2017/3/6】
使用QRmaker控件打印二维码示例  【MDZZ  2017/8/14】
读取身份证卡信息,VBA API 身份证读卡器 调用  【litao  2018/12/1】
自己开发的access程序调用bartender自动生成二维码、条...  【水若寒  2018/12/5】
也谈程序调用bartender自动生成二维码、条形码并打印标签  【老季  2018/12/6】
在窗体、报表中显示二维码  【易勋  2019/2/8】
 
 访客评论
2019/8/15张俊
厉害了

2019/5/16
在附件中采用扫码枪和键盘输入没有看到任何有差异的结果输出啊,另外对于KeyCode参数该如何设置也不是很明白?

2019/5/16
这个没看明白,用扫码枪输入和用键盘输入在这个附件中没有任何差异啊

总记录:3篇  页次:1/1 9 1 :
 
 发表评论
评论内容 (必填)

常见问答
技术分类
相关资源
文章搜索
关于作者

红尘如烟

文章分类

文章存档

友情链接