我现在正在为公司自助餐厅创建p.o.s应用程序 收银员扫描员工ID并显示其交易信息。
我的问题是收银员也可以使用他们的键盘输入(Employeeid),这是非常危险的。
if employee(true)
show employee information
then add orders
else
Exception
Currently i just hide textbox to the UI..
click New Button then cusror focus on it.
then cashier scans employeeid. <---------------in this part(The cashier can also type via keyboard) and continue transaction.
处理此方案的最佳方法是什么?规则只是必须使用条形码扫描仪。
谢谢你
答案 0 :(得分:13)
您可以监控输入代码所需的时间。读者可以比人类输入代码更快地输入代码。
答案 1 :(得分:11)
如果您可以修改扫描仪配置,则可以为扫描数据添加一些前缀/后缀。然后在代码中,您可以检测到这些添加的字符。
如果你不能,那么唯一的方法是艾哈迈德 - 测量数据输入的时间。
答案 2 :(得分:10)
使用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.
}
希望有所帮助。