【问题标题】:Reading n characters from keyboard with AutoIt (like a keylogger)使用 AutoIt 从键盘读取 n 个字符(如键盘记录器)
【发布时间】:2016-01-18 13:30:24
【问题描述】:

我想在 Windows 下使用 AutoIt 语言的小脚本处理数字条形码。

如何使用 AutoIt 从键盘截取接下来的 9 个字符?

我的条形码阅读器模拟键盘。为了区分真正的键盘输入和条形码,我对条形码阅读器进行了编程,为每个条形码添加前缀 (scrollock) 和后缀 (@)。

AutoIt 识别前缀并启动函数getbarcode(),但我没有找到从键盘输入读取的命令。相反,我发现了一个无键盘记录策略。所以我尝试了InputBox,这是一个带有单个输入字段和一个确定按钮的小部件。这对我来说太慢了。键盘输入激活当前窗口,InputBox 被推入后台。

#include <Misc.au3>
#include <MsgBoxConstants.au3>

Global $HotKeyActive = True
HotKeySet("{ScrollLock}", "getbarcode")

While 1
  Sleep(1000)
WEnd

Func getbarcode()
  If $HotKeyActive = True Then
    $HotKeyActive = False
    $InputString = InputBox("Artikelnummer", "Artikelnummer")
    MsgBox($MB_SYSTEMMODAL, "Debug", $InputString, 10)

    $HotKeyActive = True
  EndIf  
EndFunc

我通过使用HotKeySet 定义了更多在按下键 0 到 9 时执行的 10 个函数,再次尝试了它。每个函数都将其编号附加到全局字符串中。全局字符串由前缀函数重置并由后缀函数使用。它可以工作,但是字符的顺序是错误的。似乎有时间问题。

在第三次尝试中,我让条形码阅读器模拟串行设备并尝试从 AutoIt 读取 com 端口。

【问题讨论】:

  • 您是否尝试过为所有号码设置全局热键,始终保存最后 9 个号码并仅在它们出现时处理它们,否则使用 Send(...) 将它们转发到 Windows?
  • @Samoth,我为所有数字设置了全局热键,将数字附加到全局字符串中。数字顺序被打乱了;由于时间问题,我猜。我可以通过特殊字符(scrollock)识别条形码的开头。条形码的结尾可以通过另一个字符(在我的例子中为“@”)或字符数或超时来识别。

标签: keyboard barcode-scanner autoit keylogger


【解决方案1】:

这可以帮助你。它基本上为每个数字(和 Numpad-Number)设置热键,并调用一个函数来保存这些以及按下它们时的时间戳。现在,当您在一秒钟内输入 9 位数字时,输出将显示发现的条形码。否则,Number-Keystrokes 会像往常一样发送到 Windows。

#include <Array.au3>
#include <Date.au3>

Global $numbers[][] = [["0", "Zero"], ["1", "One"], ["2", "Two"], ["3", "Three"], ["4", "Four"], ["5", "Five"], ["6", "Six"], ["7", "Seven"], ["8", "Eight"], ["9", "Nine"]]

Global $flush[9] = [" ", " ", " ", " ", " ", " ", " ", " ", " "]
Global $last = $flush
Global $time[9]

Global $findTimeInSeconds = 1

For $i = 0 To UBound($numbers) - 1
    HotKeySet($numbers[$i][0], $numbers[$i][1])
    HotKeySet("{Numpad" & $numbers[$i][0] & "}", $numbers[$i][1])
Next

While True
    Sleep(1000)
WEnd


Func check()
    If StringRegExp($last[8], "[0-9]") And _DateDiff("s", $time[8], _NowCalc()) < $findTimeInSeconds Then
        ConsoleWrite(_ArrayToString($last, "") & " (Barcode found)" & @CR)
        $last = $flush
    Else
        HotKeySet($last[0])
        Send($last[0])
        HotKeySet($last[0], $numbers[$last[0]][1])
    EndIf
EndFunc

Func Zero()
    _ArrayPush($last, "0", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func One()
    _ArrayPush($last, "1", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func Two()
    _ArrayPush($last, "2", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func Three()
    _ArrayPush($last, "3", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func Four()
    _ArrayPush($last, "4", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func Five()
    _ArrayPush($last, "5", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func Six()
    _ArrayPush($last, "6", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func Seven()
    _ArrayPush($last, "7", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func Eight()
    _ArrayPush($last, "8", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

Func Nine()
    _ArrayPush($last, "9", 1)
    _ArrayPush($time, _NowCalc(), 1)
    check()
EndFunc

它有一点缺点:条形码被识别之前的数字将被打印出来......所以人们应该检查到目前为止输入的所有数字并在短时间内压制它们。这就是倾向于读者的挑战。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2018-04-14
    • 2023-03-07
    相关资源
    最近更新 更多