【问题标题】:How to Check if User input is from Barcode Scanner or Keyboard?如何检查用户输入是来自条形码扫描仪还是键盘?
【发布时间】:2011-02-23 08:07:09
【问题描述】:

我正在为一家自助餐厅公司创建一个 p.o.s 应用程序,其中 收银员扫描他的员工 ID 并显示他的交易信息。

我的问题是,收银员也可以使用他们的键盘输入(员工 ID),这是非常危险的。

if employee(true)
   show employee information
   then add orders
else
   Exception

目前我只是从 UI 中隐藏TexTbox,单击新建Button,然后将光标焦点设置在它上面。然后收银员扫描员工ID。在这部分,收银员也可以通过键盘输入并继续交易。

处理这种情况的最佳方法是什么?规则是只能使用条码扫描器。

感谢您的问候

【问题讨论】:

  • 有什么问题?检测输入来自键盘对您有何帮助?你只是要扔掉任何键盘输入吗?如果条码扫描器坏了,或者客户卡上的条码不可读怎么办?如果他们可以用键盘手动输入数字不是更好吗?这个问题与软件无关;这是人类的情况。教导员工不要使用键盘,除非是紧急情况。
  • 是的,你的权利..我正在考虑其他方法来使应用程序更安全...
  • 如果你想让它变得不可能,我不确定隐藏文本框有什么问题。他们无法在隐藏的文本框中输入内容。如果您不想让它变得不可能,我不确定您还会为安全做些什么。我无法想象这是一个真正的安全问题。如果您真的认为员工会偷窃对方的餐券,请弹出图片验证。 (我完全不理解您对问题所做的修改。)
  • 我已经进行了员工信息验证..Ahmed 建议是正确的...谢谢
  • 常见的情况是条码无法扫描,员工必须手动输入 ID。我在杂货店收银台看到了很多。扫描仪也坏了。最后,这意味着您需要一个工作扫描仪来进行 UI 测试。

标签: c# winforms io barcode-scanner


【解决方案1】:

您可以监控输入代码所花费的时间。阅读者输入代码的速度比人工输入要快得多。

【讨论】:

  • Ctrl+c / ctrl+v 打破了这个逻辑
  • @EricWu 可以是solved 琐碎
【解决方案2】:

如果您有可能修改扫描仪配置,您可以为扫描的数据添加一些前缀/后缀。然后在代码中你可以检测到那些添加的字符。

如果你不能,那么唯一的方法就是 Ahmed 的方法 - 测量数据输入的时间。

【讨论】:

    【解决方案3】:

    使用 RAW Input API 相对容易。

    看看“Distinguishing Barcode Scanners from the Keyboard in WinForms

    我有一个程序可以读取 3 个不同的 USB 扫描仪并将输入重定向到 3 个不同的“通道”进行处理。代码有点广泛,所以我不在这里发布它。 如果您愿意,我可以粘贴一些内容或通过电子邮件将项目发送给您。

    作为线索是进口:

    #region Raw Input API
    
    [DllImport( "User32.dll" )]
    extern static uint GetRawInputDeviceList( IntPtr pRawInputDeviceList, ref uint uiNumDevices, uint cbSize );
    
    [DllImport( "User32.dll" )]
    extern static uint GetRawInputDeviceInfo( IntPtr hDevice, uint uiCommand, IntPtr pData, ref uint pcbSize );
    
    [DllImport( "User32.dll" )]
    extern static bool RegisterRawInputDevices( RAWINPUTDEVICE[ ] pRawInputDevice, uint uiNumDevices, uint cbSize );
    
    [DllImport( "User32.dll" )]
    extern static uint GetRawInputData( IntPtr hRawInput, uint uiCommand, IntPtr pData, ref uint pcbSize, uint cbSizeHeader );
    
    #endregion
    

    InputDevice 添加到项目后,您可以通过以下方式监听事件:

    // Create a new InputDevice object and register InputDevice KeyPressed event handler.
    input_dev = new InputDevice( Handle );
    input_dev.KeyPressed += new InputDevice.DeviceEventHandler( m_KeyPressed );
    

    事件处理程序m_KeyPressed 可让您通过e.Keyboard.SubClass 区分您的设备

    private void m_KeyPressed( object sender, InputDevice.KeyControlEventArgs e )
    {
        // e.Keyboard.SubClass tells you where from the event came.
        // e.Keyboard.key gives you the input data.
    }
    

    希望有所帮助。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多