C#开源: 全局钩子+正则表达式=后台自动获取扫描枪数据
最近在给瑞表做一个global project,主要工作是在Warehouse模块中加入现场的称重以及Barcode Collection和Transmission.
Barcode Scanner用的是摩托罗拉的LS 4278,Ls 2208 标配。
客户希望能够达到现场操作具备手动和后台自动俩种模式,考虑到现场的使用环境和供电情况,我们放弃了串口采用键盘线的连接方式。
作为Soluation的一部分,以下是全局钩子获取条码(通过条码结构定义区别键盘输入和Scanner输入)的源代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Diagnostics;
using Microsoft.Win32;
using System.Text.RegularExpressions;
namespace BarcodeReader
{
/// <summary>
/// Barcode Reader Module
/// </summary>
public class BarcodeReader
{
private List<string> strBarcode;
private string strTempBarcode;
private string strMessage;
private string barcodeformat1;
private string barcodeformat2;
/// <summary>
/// Barcode Value
/// </summary>
public virtual List<string> Barcode
{
get
{
return strBarcode;
}
set
{
strBarcode = value;
}
}
/// <summary>
/// Errpr Message
/// </summary>
public virtual string Message
{
get
{
return strMessage;
}
set
{
strMessage = value;
}
}
/// <summary>
/// Module Initial
/// </summary>
public BarcodeReader(string formatofbarcodeA, string formatofbarcodeB)
{
strBarcode = new List<string>();
strTempBarcode = string.Empty;
strMessage = string.Empty;
barcodeformat1 = formatofbarcodeA;
barcodeformat2 = formatofbarcodeB;
}
#region Customize Module
/// <summary>
/// Keyboard Start
/// </summary>
public virtual void Hook_Start()
{
// Install Keyboard
if (hHook == 0)
{
KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
KeyBoardHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
#region Thread Hook
//hHook = SetWindowsHookEx(2,
//KeyBoardHookProcedure,
//GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());
#endregion
// Failure
if (hHook == 0)
{
Hook_Clear();
strMessage = "Fail to Install KeyBoard!";
}
}
}
/// <summary>
/// Mouse Hook Start
/// </summary>
public virtual void MouseHook_Start()
{
// Install Mouse
if (mousehook == 0)
{
MouseHookProcedure = new HookProc(MouseHookProc);
mousehook = SetWindowsHookEx(WH_MOUSE_LL,
MouseHookProcedure,
GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
#region Thread Hook
//mousehook = SetWindowsHookEx(2,
// KeyBoardHookProcedure,
// GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId());
#endregion
// failure.
if (mousehook == 0)
{
MouseHook_Clear();
strMessage = "Fail to Install Mouse!";
}
}
}
/// <summary>
/// Hook Clear
/// </summary>
public virtual void Hook_Clear()
{
bool retKeyboard = true;
if (hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
// failure
if (!retKeyboard) strMessage = "Fail to Uninstall Keyboard!";
}
/// <summary>
/// Mouse Hook Clear
/// </summary>
public virtual void MouseHook_Clear()
{
bool retMouseboard = true;
if (mousehook != 0)
{
retMouseboard = UnhookWindowsHookEx(mousehook);
mousehook = 0;
}
// failure
if (!retMouseboard) strMessage = "Fail to Uninstall Mouse!";
}
/// <summary>
/// KeyBoard Procedure
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public virtual int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
if ((int)wParam == 0x100 || (int)wParam == 0x104)
{
KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
//Catch Enter Key
if (kbh.vkCode == (int)System.Windows.Forms.Keys.Enter)
{
if (strTempBarcode != "")
{
//Transmit Barcode to main thread
string strTemp = string.Empty;
strTemp = string.Copy(strTempBarcode);
strTempBarcode = string.Empty;
if (Regex.IsMatch(strTemp, barcodeformat1))
{
if (strBarcode.Count == 0)
{
strBarcode.Add(strTemp);
strBarcode.Add("");
}
else
{
strBarcode[0] = strTemp;
}
}
else if (Regex.IsMatch(strTemp, barcodeformat2))
{
if (strBarcode.Count != 2)
{
if (strBarcode.Count == 0)
{
strBarcode.Add("");
strBarcode.Add(strTemp);
}
else
{
strBarcode.Add(strTemp);
}
}
else
{
strBarcode[1] = strTemp;
}
}
}
// Scan Result Check
if (strBarcode.Count == 2)
{
if (!string.IsNullOrEmpty(strBarcode[0]) && !string.IsNullOrEmpty(strBarcode[1]))
{
strMessage = "Barcode has been read";
}
else if (string.IsNullOrEmpty(strBarcode[0]))
{
strMessage = "Please read first Barcode";
}
else if (string.IsNullOrEmpty(strBarcode[1]))
{
strMessage = "Please read second Barcode";
}
else
{
strMessage = "Please read Both of Barcode";
}
}
else
{
strMessage = "Please read Both of Barcode";
}
}
else
{
if ((kbh.vkCode >= 8 && kbh.vkCode <= 47) || (kbh.vkCode >= 112 && kbh.vkCode <= 123))
{
}
else
{
StringBuilder strKeyName = new StringBuilder(225);
if (GetKeyNameText(kbh.scanCode * 65536, strKeyName, 255) > 0)
{
strTempBarcode = strTempBarcode + strKeyName.ToString().Trim(new char[] { ' ', '\0' });
}
}
}
}
}
//if (nCode >= 0)
//{
// KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
// //if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
// //{
// // MessageBox.Show("快捷键已拦截!不能保存!");
// // return 1;
// //}
// if (kbh.vkCode == (int)Keys.Delete
// && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
// {
// MessageBox.Show("!DeleteDeleteDeleteDeleteDelete");
// return 1;
// }
// if (kbh.vkCode == (int)Keys.F10)
// {
// //SendMessage(btn1Handle, WM_LBUTTONDBLCLK, 0, 0);
// //SendMessage(btn1Handle, WM_LBUTTONUP, 0, 0);
// SendMessage(this.Handle, 500, 0, 0);
// return 1;
// }
// if (kbh.vkCode == (int)Keys.F11)
// {
// //SendMessage(btn1Handle, WM_LBUTTONDBLCLK, 0, 0);
// //SendMessage(btn1Handle, WM_LBUTTONUP, 0, 0);
// SendMessage(this.Handle, 501, 0, 0);
// return 1;
// }
//}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
/// <summary>
/// Mouse Procedure
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
public virtual int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
// MouseHookStruct kbh = (MouseHookStruct)Marshal.PtrToStructure(wParam, typeof(MouseHookStruct));
//if (kbh.vkCode == (int)Keys.S && (int)Control.ModifierKeys == (int)Keys.Control) // 截获F8
//{
// MessageBox.Show("快捷键已拦截!不能保存!");
// return 1;
//}
//if (kbh.vkCode == (int)Keys.Delete
// && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt) //截获Ctrl+Alt+Y
//{
// MessageBox.Show("!DeleteDeleteDeleteDeleteDelete");
// return 1;
//}
if ((int)wParam == (int)WM_MOUSE.WM_MOUSEMOVE)
{
//SendMessage(btn1Handle, WM_LBUTTONDBLCLK, 0, 0);
//SendMessage(btn1Handle, WM_LBUTTONUP, 0, 0);
//if (!this.Bounds.Contains(Form.MousePosition))
//{
//SendMessage(this.Handle, 500, 0, 0);
//return 1;
//}
}
//if ((int)wParam == (int)WM_MOUSE.WM_RBUTTONDOWN)
//{
// //SendMessage(btn1Handle, WM_LBUTTONDBLCLK, 0, 0);
// //SendMessage(btn1Handle, WM_LBUTTONUP, 0, 0);
// SendMessage(this.Handle, 501, 0, 0);
// return 1;
//}
}
return CallNextHookEx(mousehook, nCode, wParam, lParam);
}
private const uint WM_LBUTTONUP = 0X202;
private const uint WM_LBUTTONDBLCLK = 0X201;
#endregion
#region Delegate
//Delegate
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
static int hHook = 0;
static int mousehook = 0;
public const int WH_KEYBOARD_LL = 13;
private const int WH_MOUSE_LL = 14;
HookProc KeyBoardHookProcedure;
HookProc MouseHookProcedure;
//键盘Hook结构函数
[StructLayout(LayoutKind.Sequential)]
public class KeyBoardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
///
/// 鼠标钩子事件结构定义
///
/// 详细说明请参考MSDN中关于 MSLLHOOKSTRUCT 的说明
[StructLayout(LayoutKind.Sequential)]
public struct MouseHookStruct
{
///
/// Specifies a POINT structure that contains the x- and y-coordinates of the cursor, in screen coordinates.
///
public POINT Point;
public UInt32 MouseData;
public UInt32 Flags;
public UInt32 Time;
public UInt32 ExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
}
#endregion
#region DllImport
//Hook Setting
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
//Hook Uninstall
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll")]
//Hook Call
public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
public static extern int GetCurrentThreadId();
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);
[DllImport("User32.dll")]
private static extern IntPtr SendMessage(IntPtr hwnd, uint msg, int wParam, int lParam);
[DllImport("User32.dll")]
private static extern int GetKeyNameText(int IParam, StringBuilder lpBuffer, int nSize);
#endregion
#region MOUSEEVENT
/// <summary>
/// Mouse event
/// </summary>
public enum WM_MOUSE : int
{
///
/// 鼠标开始
///
WM_MOUSEFIRST = 0X200,
///
/// 鼠标移动
///
WM_MOUSEMOVE = 0X200,
///
/// 左键按下
///
WM_LBUTTONDOWN = 0X201,
///
/// 左键释放
///
WM_LBUTTONUP = 0X202,
///
/// 左键双击
///
WM_LBUTTONDBLCLK = 0X203,
///
/// 右键按下
///
WM_RBUTTONDOWN = 0X204,
///
/// 右键释放
///
WM_RBUTTONUP = 0X205,
///
/// 右键双击
///
WM_RBUTTONDBLCLK = 0X206,
///
/// 中键按下
///
WM_MBUTTONDOWN = 0X207,
///
/// 中键释放
///
WM_MBUTTONUP = 0X208,
///
/// 中键双击
///
WM_MBUTTONDBLCLK = 0X209,
///
/// 滚轮滚动
///
/// WINNT4.0以上才支持此消息
WM_MOUSEWHEEL = 0x020A
}
#endregion
}
}
转载于:https://www.cnblogs.com/David-Shaw/archive/2012/10/12/2720972.html
C#开源: 全局钩子+正则表达式=后台自动获取扫描枪数据相关推荐
- 全局钩子+正则表达式=后台自动获取扫描枪数据
最近在给瑞表做一个global project,主要工作是在Warehouse模块中加入现场的称重以及Barcode Collection和Transmission. Barcode Scanner用 ...
- 安卓版PDA扫码获取扫描枪数据;input获取焦点不弹出虚拟键盘;解决页面btn可操作数据的逻辑,导致DOM元素渲染,input的readonly失效
html部分: 页面需要一个容器来接收扫描数据 注意:安卓版PDA扫描不同于win系统版本,安卓版本获取扫描数据时并不是keyCode按键依次获取,而是一次性给出扫描的数据 <!--扫描枪数据接 ...
- JQuery获取扫描枪扫描的数据
1).首先我们得知道扫描枪的性质跟键盘是一样的,都是输入设备(可以等价理解为扫描枪就是键盘).然后每次扫描完都会自动输入一个回车按钮.例如我们扫描一个条形码(中国商品的条形码上的数值都是13位的),相 ...
- c# 获取串口扫描枪数据
之前负责过一个机场的项目,有一个环节是扫描旅客登机牌,获取旅客信息的操作,当时是拟定了使用串口扫描枪来获取登机牌信息,后面又测试了网口的,这里记录一下当时用来测试串口使用的程序,供有需求的小伙伴们参考 ...
- java获取扫描枪的数据到数据库
基本思路: 1.通过按钮获取输入框焦点 2.扫描二维码或条形码,并设置回车键(大部分扫描枪已自动设置) 3.在输入框设置回车 事件 4.获取输入框的值,将数据传入数据库 代码如下: jsp: &l ...
- python获取usb扫描枪数据_GitHub - RobinGitHub/USB4ScanGun: USB扫描枪识别,已获取对应扫描枪返回值的测试程序...
USB4ScanGun PS:最近在测试点东西,要看这个项目的朋友麻烦用稍早前的版本.之后测试结果也会写在这里,或者博客中的.--2014年9月28日 USB扫描枪识别,已获取对应扫描枪返回值的测试程 ...
- 数据爬取遇到EventStream是个什么东西?EventSource与websocket有何区别?Java后台如何获取爬取数据并入库?EventStream后台服务怎么写?
好久没更新了,今天办完房子装修手续,有点空咱们更新一下. 今天更新的内容是以前工作中采集数据的时候遇到的,目前我遇到的通过EventSource方式给前端提供数据的方式比较少,只见过这一种但是这种方式 ...
- JS如何获取扫描枪扫描的条形码
//页面初始化 $.function({//1. 在页面初始化的时候调用一下代码:initScannerModule();})function initScannerModule(){var code ...
- S如何获取扫描枪扫描的数据
https://blog.csdn.net/jifengdalu/article/details/83031664
最新文章
- 如何利用BP网络进行神经网络变量筛选
- element 如何自定义svg图标_4000+免费可自定义的图标集合
- Weighted distance in sklearn KNN
- 图解Detours实例
- 高并发项目Java是标配?.NET Core要将它拉下“神坛”!
- 特殊年份(java)
- 工信部:短信可为 16 亿用户提供行程证明;OPPO 回应造芯计划;Windows Terminal 0.9 发布| 极客头条...
- Linux系统配置及服务管理_第03章用户管理
- Linux内核使用的字符串转整形数和16进制数
- [转]Android的Handler总结
- shopnc B2B2C商城 Nginx下开启伪静态
- Android开源项目库汇总
- 弱监督学习总结(1)
- simulink upd通信
- layui表单—用户注册界面
- SCI检索号识别一法:UT-WOS与UT-ISI
- 对外汉语偏误语料库_对外汉语偏误汇总
- 利用计算机网线传东西,如何把文件通过一个网线从一个电脑传到另一个电脑上...
- ue4-摄像机动画Matinee(多图慎入)
- 网络口碑营销的特点、技巧、价值
热门文章
- 晒婚纱照了! ^_^
- 数据分析有哪些好书值得推荐?
- C语言——一元二次方程求解
- 基于matlab的数字调制,基于MATLAB的多功能数字调制系统信号源仿真
- 佰马智慧灯杆管理运维平台
- 用什么查看java dump文件
- 【libuv高效编程】libuv学习超详细教程3——libuv事件循环
- 计算机 名片,计算机版本的名片识别软件
- 华山论剑之契约式编程与防御式编程
- AttributeError: module ‘torchtext.data‘ has no attribute ‘Field‘ 解决