python获取usb扫描数据_抓取扫描扫描数据的案例

python获取usb扫描数据_抓取扫描扫描数据的案例
1 usingSystem;
平衡梁
2 usingSystem.Collections.Generic;
3 usingSystem.Linq;
4 usingSystem.Runtime.InteropServices;
5 usingSystem.Text;
6 usingSystem.Threading.Tasks;
7 usingSystem.Windows.Forms;8
9 namespaceMedicalMain10 {11 public classKeyboardHook12 {13 public eventKeyEventHandler KeyDownEvent;14 public eventKeyPressEventHandler KeyPressEvent;15 public eventKeyEventHandler KeyUpEvent;16
17 public delegate int HookProc(intnCode, Int32 wParam, IntPtr lParam);18 static int hKeyboardHook =
0; //声明键盘钩⼦处理的初始值19 //值在Microsoft SDK的Winuser.h⾥查询
20 public const int WH_KEYBOARD_LL = 13; //线程键盘钩⼦监听键盘消息设为2,全局键盘监听⿏标消息设为13
21 HookProc KeyboardHookProcedure; //声明KeyboardHookProcedure作为HookProc类型22 //键盘结构
23 [StructLayout(LayoutKind.Sequential)]24 public classKeyboardHookStruct25 {26 public int vkCode; //定⼀个虚拟键码。该代码必须有⼀个价值的范围1⾄254
27 public int scanCode; //指定的硬件扫描码的关键
28 public int flags; //键标志
29 public int time; //指定的时间戳记的这个讯息
30 public int dwExtraInfo; //指定额外信息相关的信息
31 }32 //使⽤此功能,安装了⼀个钩⼦
33 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]34 public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, intthreadId);35
36
37 //调⽤此函数卸载钩⼦
38 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]39 public static extern bool UnhookWindowsHookEx(intidHook);40
41
42 //使⽤此功能,通过信息钩⼦继续下⼀个钩⼦
43 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]44 public static extern int CallNextHookEx(int idHook, intnCode, Int32 wParam, IntPtr lParam);45
46 //取得当前线程编号(线程钩⼦需要⽤到)
47 [DllImport("kernel32.dll")]48 static extern intGetCurrentThreadId();49
50 //使⽤WINDOWS API函数代替获取当前实例的函数,防⽌钩⼦失效
51 [DllImport("kernel32.dll")]52 public static extern IntPtr GetModuleHandle(stringname);53
54 public voidStart()55 {56 //安装键盘钩⼦
57 if (hKeyboardHook == 0)58 {59 KeyboardHookProcedure = newHookProc(KeyboardHookProc);60 hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure,
GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);61 //hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);62 //************************************63 //键盘线程钩⼦64 //SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId());//指定要监听的线程idGetCurrentThreadId(),65 //键盘全局钩⼦,需要引⽤空间(using System.Reflection;)66 //SetWindowsHookEx(
13,MouseHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);67 //
68 //关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数将钩⼦加⼊到钩⼦链表中,说明⼀下四个参数:69 //idHook 钩⼦类型,即确定钩⼦监听何种消息,上⾯的代码中设为2,即监听键盘消息并且是线程钩⼦,如果是全局钩⼦监听键盘消息应设为13,70 //线程钩⼦监听⿏标消息设为7,全局钩⼦监听⿏标消息设为14。lpfn 钩⼦⼦程的地址指针。如果dwThreadId 参数为0 或是⼀个由别的进程创建的71 //线程的标识,lpfn必须指向DLL中的钩⼦⼦程。 除此以外,lpfn可以指向当前进程的⼀段钩⼦⼦程代码。钩⼦函数的⼊⼝地址,当钩⼦钩到任何72 //消息后便调⽤这个函数。hInstance应⽤程序实例的句柄。标识包含lpfn所指的⼦程的DLL。如果threadId 标识当前进程创建的⼀个线程,⽽且⼦73 //程代码位于当前进程,hInstance必须为NULL。可以很简单的设定其为本应⽤程序的实例句柄。threaded 与安装的钩⼦⼦程相关联的线程的标识符74 //如果为0,钩⼦⼦程与所有的线程关联,即为全局钩⼦75 //************************************76 //如果SetWindowsHookEx失败
77 if (hKeyboardHook == 0)78 {79 Stop();80 throw new Exception("安装键盘钩⼦失败");81 }82 }83 }84 public voidStop()85 {86 bool retKeyboard = true;87
88
89 if (hKeyboardHook != 0)90 {91 retKeyboard =UnhookWindowsHookEx(hKeyboardHook);92 hKeyboardHook = 0;93 }94
95 if (!(retKeyboard)) throw new Exception("卸载钩⼦失败!");96 }97 //ToAscii职能的转换指定的虚拟键码和键盘状态的相应字符或字符
98 [DllImport("user32")]99 public static extern int ToAscii(int uVirtKey, //[in] 指定虚拟关键代码进⾏翻译。地震的模拟实验
100 int uScanCode, //[in] 指定的硬件扫描码的关键须翻译成英⽂。⾼阶位的这个值设定的关键,如果是(不压)
优糖米101 byte[] lpbKeyState, //[in] 指针,以256字节数组,包含当前键盘的状态。每个元素(字节)的数组包含状态的⼀个关键。如果⾼阶位的字节是⼀套,关键是下跌(按下)。在低⽐特,如果设置表明,关键是对切换。在此功能,只有肘位的CAPS LOCK键是相关的。在切换状态的NUM个锁和滚动锁定键被忽略。
102 byte[] lpwTransKey, //[out] 指针的缓冲区收到翻译字符或字符。
103 int fuState); //[in] Specifies whether a menu is active. This parameter must be 1 if a menu is acti
ve, or 0 otherwise.104
105 //获取按键的状态
verticalsync106 [DllImport("user32")]107 public static extern int GetKeyboardState(byte[] pbKeyState);108
109
110 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]111 private static extern short GetKeyState(intvKey);112
113 private const int WM_KEYDOWN = 0x100;//KEYDOWN
114 private const int WM_KEYUP = 0x101;//KEYUP
115 private const int WM_SYSKEYDOWN = 0x104;//SYSKEYDOWN
116 private const int WM_SYSKEYUP = 0x105;//SYSKEYUP
117
118 private int KeyboardHookProc(intnCode, Int32 wParam, IntPtr lParam)119 {120 //侦听键盘事件
121 if ((nCode >= 0) && (KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null))122 {123 KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam,
typeof(KeyboardHookStruct));124 //raise KeyDown
应用集成
125 if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam ==WM_SYSKEYDOWN))126 {127 Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;128 KeyEventArgs e = newKeyEventArgs(keyData);129 KeyDownEvent(this, e);130 }131
132 //键盘按下
133 if (KeyPressEvent != null && wParam ==WM_KEYDOWN)134 {135 byte[] keyState = new byte[256];136 GetKeyboardState(keyState);137
138 byte[] inBuffer = new byte[2];139 if (ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags) == 1)140 {141 KeyPressEventArgs e = new
KeyPressEventArgs((char)inBuffer[0]);142 KeyPressEvent(this, e);143 }144 }145
146 //键盘抬起
147 if (KeyUpEvent != null && (wParam == WM_KEYUP || wParam ==WM_SYSKEYUP))148 {149 Keys keyData =
(Keys)MyKeyboardHookStruct.vkCode;150 KeyEventArgs e = newKeyEventArgs(keyData);151 KeyUpEvent(this, e);152
}153
154 }155 //如果返回1,则结束消息,这个消息到此为⽌,不再传递。156 //如果返回0或调⽤CallNextHookEx函数则消息出了这个钩⼦继续往下传递,也就是传给消息真正的接受者
157 returnCallNextHookEx(hKeyboardHook, nCode, wParam, lParam);158 }159
160 ~KeyboardHook()161 {162 Stop();163 }164
红外光通讯165 }166 }

本文发布于:2024-09-25 12:30:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/311132.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:键盘   消息   监听   线程   指定   关键   状态
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议