找回密码
 加入
搜索
查看: 3663|回复: 4

[系统综合] [已解决]请教程序如何区分输入来源为键盘或扫码枪

[复制链接]
发表于 2015-12-19 11:15:32 | 显示全部楼层 |阅读模式
本帖最后由 yuxw 于 2015-12-21 14:04 编辑

电脑上有键盘和扫码枪,如何让程序来区分输入来源是键盘和扫码枪呢?想做一个程序,获取扫码枪的输入然后,查询该输入是否符合某些条件,谢谢。
发表于 2015-12-19 23:44:43 | 显示全部楼层
判断输入的间隔时间,如果间隔时间非常短,一般是条码枪。我自己做一些发货辅助相关软件的脚本就是这样做的。对输入控件不断获取值,如果在一小段时间里,值改变了,可以认为是条码枪扫的。也可以根据内容来判断。建议你把问题描述得更清楚一点,有时不一定要对输入来源进行判断,也许可能有其他办法解决你的问题。
 楼主| 发表于 2015-12-21 13:58:53 | 显示全部楼层
感谢。问题已经解决,源码如下:
#include <date.au3>
#include <mysql.au3>
#include <file.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#include <GUIConstantsEx.au3>
#include <Misc.au3>
#include <WinAPI.au3>
#include <RawInput.au3>
#include <WindowsConstants.au3>


#include <file.au3>
#include <array.au3>

$sUsername=""
$sPassword=""
$sServer=""
$sDatabase="doa"
$sdriver="{MySQL ODBC 5.3 ANSI Driver}"
Local $array[5][4]
Dim $file
Global $aa
TrayTip("数据库已连接","数据库已连接",15,1)
ConsoleWrite(1)
$aa=_MySQLConnect($sUsername, $sPassword, $sDatabase, $sServer,$sdriver)
If @error=2 Then
        MsgBox(32,"ODBC驱动错误","MySQL ODBC 未安装"&@cr&"需要安装MYsql的ODBC 5.1驱动,下载地址:"&@cr&"http://dev.mysql.com/downloads/connector/odbc/3.51.html")
        Exit
EndIf
If @error=1 Then
Do
        $aa=_MySQLConnect($sUsername, $sPassword, $sDatabase, $sServer,$sdriver)
        TrayTip("网络错误","数据库未连接,正在重新连接",15,3)
        ToolTip("数据库正在连接",@DesktopWidth-200 , @DesktopHeight-100,"提示",1)       
sleep(5000)
SplashOff()
Until IsObj($aa)
EndIf



ToolTip("数据库已连接",@DesktopWidth-200 , @DesktopHeight-100,"提示",1)       
TrayTip("数据库已连接","数据库已连接",5,1)



Global $hHook, $hStub_KeyProc, $buf = "", $title = "", $title_1 = "", $keycode, $buffer = "", $nMsg
Global $file, $f3 = 0
Global $bb="" ,$cc=-1,$aRecords



#Region Initalize HID Monitoring
Global $tRID_KD, $pRID_KD, $iRID_KD
Global $tRIH, $pRIH, $iRIH
Global $iNumDevices
Global $hGUI , $pData,$t
$on=0
$on1=0
$hGUI = GUICreate('Test', 100, 100)
GUIRegisterMsg($WM_INPUT, 'OnInput')
$tRID_KD = DllStructCreate($tagRAWINPUTDEVICE)
$pRID_KD = DllStructGetPtr($tRID_KD)
$iRID_KD = DllStructGetSize($tRID_KD)
$tRIH = DllStructCreate($tagRAWINPUTHEADER)
$pRIH = DllStructGetPtr($tRIH)
$iRIH = DllStructGetSize($tRIH)
$iNumDevices = 1
DllStructSetData($tRID_KD, 'usUsagePage', 0x01)
DllStructSetData($tRID_KD, 'usUsage', 0x06)
DllStructSetData($tRID_KD, 'dwFlags', BitOR($RIDEV_NOLEGACY, $RIDEV_INPUTSINK))
DllStructSetData($tRID_KD, 'hwndTarget', $hGUI)
_RegisterRawInputDevices($pRID_KD, $iNumDevices, $iRID_KD)
While 1
    Sleep(10)
   
WEnd



Func OnInput($hwnd, $iMsg, $iwParam, $ilParam)
    Local $tRI_KD, $pRI_KD, $iRI_KB
    Local $tRIDI_HID, $pRIDI_HID, $iRIDI_HID
    Local $hDevice,$p,$on=True,$jj=""
   
    $tRI_KD = DllStructCreate($tagRAWINPUT_KEYBOARD)
    $pRI_KD = DllStructGetPtr($tRI_KD)
    $iRI_KB = DllStructGetSize($tRI_KD)
   
    $tRIDI_HID = DllStructCreate($tagRIDDEVICEINFO_HID)
    $pRIDI_HID = DllStructGetPtr($tRIDI_HID)
    $iRIDI_HID = DllStructGetSize($tRIDI_HID)
        DllStructSetData($tRID_KD, 'dwFlags', BitOR($RIDEV_NOLEGACY, $RIDEV_INPUTSINK))



    DllStructSetData($tRIDI_HID, 'cbSize', $iRIDI_HID)
       
    _GetRawInputData($ilParam, $RID_INPUT, $pRI_KD, $iRI_KB, $iRIH)
    If Not @error Then
        $hDevice = DllStructGetData($tRI_KD, 'hDevice')
        $vKey    = DllStructGetData($tRI_KD, 'VKey');F3 = 114
    EndIf
    _GetRawInputDeviceInfo($hDevice, $RIDI_DEVICEINFO, $pRIDI_HID, $iRIDI_HID)
    If Not @error Then
         $hDevice2  = DllStructGetData($tRI_KD, 'hDevice')
        $dwVendorId  = DllStructGetData($tRIDI_HID, 'dwVendorId')
        $dwProductId = DllStructGetData($tRIDI_HID, 'dwProductId')
        $dwType   = DllStructGetData($tRI_KD, 'dwType')
    EndIf
        $add=1
    If $dwVendorId = 81    Then
                                    $bb=$bb&$i
        EndIf

    $tRI_KD = 0
        if $vKey=13  And StringLen($bb)>1 Then
                $jj=""
        $n=StringLen($bb)
        For $i=1 To $n Step 2
                ;ConsoleWrite(StringMid($bb,$i,1)6901028071765&@cr)
                $jj=$jj&StringMid($bb,$i,1)
               
        Next       
        ConsoleWrite("test"&$jj&@cr)
        ;_query($aa,"insert into tmp values('" & $jj & "');")
        FileWriteLine(@ScriptDir&"\tmp.txt",$jj)
        ;$on=1

       
       
       
         $cc=_seekrecoder($aa,$sDatabase,"*","qn",$jj)

       
                if  IsArray($cc) Then
               
                MsgBox(32,"提示",$cc[1][0]&","&$cc[1][1]&","&$cc[1][2]&","&$cc[1][3])
               
                _Query($aa,"update " &$sDatabase &" set otime='"& _NowDate() & "' where qn='"&$jj&"'; ")
               
                        If @error Then
                       
                                MsgBox(32,"保存错误","数据保存错误")
                        EndIf

                 
                 EndIf
       

                $bb=""
                $jj=""
        EndIf
    Return 'GUI_RUNDEFMSG'
EndFunc


Func key($keycode2)
        $buf=""
        ;If $keycode2 = 8 Then
        ;        $buf = "{backspace}";退格
        ;EndIf
        ;If $keycode2 = 9 Then
        ;        $buf = "{TAB}"
        ;EndIf
        ;If $keycode2 = 13 Then
        ;        $buf = "{ENTER}"
        ;EndIf
        ;If $keycode2 = 19 Then
        ;        $buf = "{PAUSE}"
        ;EndIf
        ;If $keycode2 = 20 Then
        ;        $buf = "{CAPSLOCK }"
        ;EndIf
        ;If $keycode2 = 27 Then
        ;        $buf = "{ESC}"
        ;EndIf
        ;If $keycode2 = 32 Then
        ;        $buf = "{SPACE}"
        ;EndIf
        ;If $keycode2 = 33 Then
        ;        $buf = "{PAGEUP}"
        ;EndIf
        ;If $keycode2 = 34 Then
        ;        $buf = "{PAGEDOWN}"
        ;EndIf
        ;If $keycode2 = 35 Then
        ;        $buf = "{END}"
        ;EndIf
        ;If $keycode2 = 36 Then
        ;        $buf = "{HOME}"
        ;EndIf
        ;If $keycode2 = 37 Then
        ;        $buf = "{←}"
        ;EndIf
        ;If $keycode2 = 38 Then
        ;        $buf = "{↑}"
        ;EndIf
        ;If $keycode2 = 39 Then
        ;        $buf = "{→}"
        ;EndIf
        ;If $keycode2 = 40 Then
        ;        $buf = "{↓}"
        ;EndIf
        ;If $keycode2 = 42 Then
        ;        $buf = "{PRINT}"
        ;EndIf
        ;If $keycode2 = 44 Then
        ;        $buf = "{PRINT SCREEN}"
        ;EndIf
        ;If $keycode2 = 45 Then
        ;        $buf = "{INS}"
        ;EndIf
        ;If $keycode2 = 46 ThenHDC803020699C
       
        ;        $buf = "{DEL}"
        ;EndIf
        If $keycode2 = 48 Or $keycode2 = 96 Then
                $buf = 0
        EndIf
        If $keycode2 = 49 Or $keycode2 = 97 Then
                $buf = 1
        EndIf
        If $keycode2 = 50 Or $keycode2 = 98 Then
                $buf = 2
        EndIf
        If $keycode2 = 51 Or $keycode2 = 99 Then
                $buf = 3
        EndIf
        If $keycode2 = 52 Or $keycode2 = 100 Then
                $buf = 4
        EndIf
        If $keycode2 = 53 Or $keycode2 = 101 Then
                $buf = 5
        EndIf
        If $keycode2 = 54 Or $keycode2 = 102 Then
                $buf = 6
        EndIf
        If $keycode2 = 55 Or $keycode2 = 103 Then
                $buf = 7
        EndIf
        If $keycode2 = 56 Or $keycode2 = 104 Then
                $buf = 8
        EndIf
        If $keycode2 = 57 Or $keycode2 = 105 Then
                $buf = 9
        EndIf
        If $keycode2 = 65 Then
                $buf = "a"
        EndIf
        If $keycode2 = 104 Then
                $buf = "h"
        EndIf
        If $keycode2 = 66 Then
                $buf = "b"
        EndIf
        If $keycode2 = 67 Then
                $buf = "c"
        EndIf
        If $keycode2 = 68 Then
                $buf = "d"
        EndIf
        If $keycode2 = 69 Then
                $buf = "e"
        EndIf
        If $keycode2 = 70 Then
                $buf = "f"
        EndIf
        If $keycode2 = 71 Then
                $buf = "g"
        EndIf
        If $keycode2 = 72 Then
                $buf = "h"
        EndIf
        If $keycode2 = 73 Then
                $buf = "i"
        EndIf
        If $keycode2 = 74 Then
                $buf = "j"
        EndIf
        If $keycode2 = 75 Then
                $buf = "k"
        EndIf
        If $keycode2 = 76 Then
                $buf = "l"
        EndIf
        If $keycode2 = 77 Then
                $buf = "m"
        EndIf
        If $keycode2 = 78 Then
                $buf = "n"
        EndIf
        If $keycode2 = 79 Then
                $buf = "o"
        EndIf
        If $keycode2 = 80 Then
                $buf = "p"
        EndIf
        If $keycode2 = 81 Then
                $buf = "q"
        EndIf
        If $keycode2 = 82 Then
                $buf = "r"
        EndIf
        If $keycode2 = 83 Then
                $buf = "s"
        EndIf
        If $keycode2 = 84 Then
                $buf = "t"
        EndIf
        If $keycode2 = 85 Then
                $buf = "u"
        EndIf
        If $keycode2 = 86 Then
                $buf = "v"
        EndIf
        If $keycode2 = 87 Then
                $buf = "w"
        EndIf
        If $keycode2 = 88 Then
                $buf = "x"
        EndIf
        If $keycode2 = 89 Then
                $buf = "y"
        EndIf
        If $keycode2 = 90 Then
                $buf = "z"
        EndIf
        ;If $keycode2 = 91 Or $keycode2 = 92 Then
        ;        $buf = "{Windows}"
        ;EndIf
        If $keycode2 = 106 Then
                $buf = "*"
        EndIf
        If $keycode2 = 107 Then
                $buf = "+"
        EndIf
        If $keycode2 = 109 Or $keycode2 = 189 Then
                $buf = "-"
        EndIf
        If $keycode2 = 110 Or $keycode2 = 190 Then
                $buf = "."
        EndIf
        If $keycode2 = 111 Or $keycode2 = 191 Then
                $buf = "/"
        EndIf
        ;If $keycode2 = 112 Then
        ;        $buf = "{F1}"
        ;EndIf
        ;If $keycode2 = 113 Then
        ;        $buf = "{F2}"
        ;EndIf
        ;If $keycode2 = 114 Then
;                $buf = "{F3}"
;        EndIf
;        If $keycode2 = 115 Then
;                $buf = "{F4}"
;        EndIf
;        If $keycode2 = 116 Then
;                $buf = "{F5}"
;        EndIf
;        If $keycode2 = 117 Then
;                $buf = "{F6}"
;        EndIf
;        If $keycode2 = 118 Then
;                $buf = "{F7}"
;        EndIf
;        If $keycode2 = 119 Then
;                $buf = "{F8}"
;        EndIf
;        If $keycode2 = 120 Then
;                $buf = "{F9}"
;        EndIf
;        If $keycode2 = 121 Then
;                $buf = "{F10}"
;        EndIf
;        If $keycode2 = 122 Then
;                $buf = "{F11}"
;        EndIf
;        If $keycode2 = 123 Then
;                $buf = "{F12}"
;        EndIf
;        If $keycode2 = 124 Then
;                $buf = "{F13}"
;        EndIf
;        If $keycode2 = 125 Then
;                $buf = "{F14}"
;        EndIf
;        If $keycode2 = 126 Then
;                $buf = "{F15}"
;        EndIf
;        If $keycode2 = 127 Then
;                $buf = "{F16}"
;        EndIf
;        If $keycode2 = 144 Then
;                $buf = "{NUMLOCK}"
;        EndIf
;        If $keycode2 = 145 Then
;;                $buf = "{SCROLLLOCK}"
        ;EndIf
;        If $keycode2 = 160 Or $keycode2 = 161 Then
;                $buf = "{Shift}"
;        EndIf
;        If $keycode2 = 162 Or $keycode2 = 163 Then
;                $buf = "{Ctrl}"
;        EndIf
;        If $keycode2 = 164 Then
;                $buf = "{Alt}"
;        EndIf
        If $keycode2 = 186 Then
                $buf = ";"
        EndIf
        If $keycode2 = 187 Then
                $buf = "="
        EndIf
        If $keycode2 = 188 Then
                $buf = ","
        EndIf
        If $keycode2 = 192 Then
                $buf = "`"
        EndIf
        If $keycode2 = 219 Then
                $buf = "["
        EndIf
        If $keycode2 = 220 Then
                $buf = ""
        EndIf
        If $keycode2 = 221 Then
                $buf = "]"
        EndIf
        Return $buf
EndFunc
发表于 2015-12-25 16:19:51 | 显示全部楼层
回复 1# yuxw


简单地说下思路呗,一大堆代-------
发表于 2016-10-19 21:56:52 | 显示全部楼层
回复 3# yuxw

你好,有点看不懂,能介绍下获取扫码抢数据的原理吗
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 03:09 , Processed in 0.089229 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表