扫码识别实现方法
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
namespace CashierProject.ManageUtils
{
/// <summary>
/// 扫码识别
/// </summary>
public class ScanHook
{
public List<string> matchString { get; set; }//验证是否正确的收款码等信息
public const int WM_KEYDOWN = 256;
public const int WM_KEYUP = 257;
public const int WM_SYSKEYDOWN = 260;
public const int WM_SYSKEYUP = 261;
private int hKeyboardHook;
private static HookProc hookproc;
private static ScanHook instance;
public delegate void ScanerDelegate(string code);
private delegate int HookProc(int nCode, int wParam, IntPtr lParam);
public event ScanerDelegate ScanerEvent;
private int delayInputTime = 150;
private int delayOutputTime = 1000;
private List<EventMsg> keys = new List<EventMsg>();
private int last;
private int first;
private bool isPause;
private Thread delayThread;
private bool isBreak = true;
private object lockObject = new object();
public struct EventMsg
{
public int keyCode;
public int paramL;
public int paramH;
public int Time;
public int hwnd;
public int keyType;
}
public struct Result
{
public List<EventMsg> keyCodes;
public string result;
public bool isIntercept;
public bool isScan;
}
public static ScanHook getInstance()
{
if (instance == null)
{
instance = new ScanHook();
}
return instance;
}
/// <summary>
/// 加载钩子
/// </summary>
/// <param name="idHook"></param>
/// <param name="lpfn"></param>
/// <param name="hInstance"></param>
/// <param name="threadId"></param>
/// <returns></returns>
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
/// <summary>
/// 卸载钩子
/// </summary>
/// <param name="idHook"></param>
/// <returns></returns>
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
private static extern bool UnhookWindowsHookEx(int idHook);
/// <summary>
/// 当一个文件被映射到调用进程的地址空间时,GetModuleHandle函数得到其中某一模块的句柄
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);
public void SetDelayInputTime(int delayTime)
{
delayInputTime = delayTime;
}
public void SetDelayOutputTime(int delayTime)
{
delayOutputTime = delayTime;
}
/// <summary>
/// 开启键盘监听
/// </summary>
/// <returns></returns>
public bool Start()
{
if (hKeyboardHook == 0)
{
hookproc = new Hoo

本文深入解析了扫码识别的实现方法,包括键盘监听、事件拦截、正则验证等关键步骤,展示了如何通过C#代码实现扫码功能,并提供了详细的代码示例。
&spm=1001.2101.3001.5002&articleId=106155337&d=1&t=3&u=901239917ce8411e9fba4463f1b98365)
2174

被折叠的 条评论
为什么被折叠?



