窗体描述:
在一个窗体里面,fMain.cs
有4个输入框TextBox,1个数字输入框NumericUpDown,都有回车事件。
有2个PrictureBox,放置条形码,条码内容分别为StartExecution和EndExecution
操作描述:
上述5个输入框安装顺序垂直排列,焦点在一个文本框,扫码枪扫描获取内容回车触发文本框事件验证数据,数据正确则焦点跳入下一文本框,直到焦点到最后一个输入文本框。这是输入数字后,扫描任意一个条形码,获取条形码内容 直接执行对应方法。
问题描述:
如何实现全局监视获取条形码的内容?且无需获取焦点位置,扫描条形码后直接执行方法即可。
C# Win Form窗体USB扫码枪扫描条形码问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
7条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
为了解决您的问题,我们需要在窗体中添加一个全局的热键监听器,以便在任何时候都能捕获到条形码扫描后的结果。这里我们将使用
Application.AddMessageFilter()
方法来实现这个功能。同时,我们还需要定义两个方法,分别用于处理StartExecution和EndExecution条形码的触发。首先,在
fMain.cs
文件顶部添加必要的命名空间:using System; using System.Windows.Forms; using System.Runtime.InteropServices; public partial class fMain : Form { // ... }
然后,定义两个处理条形码的方法:
private void HandleStartExecution(string data) { // 在这里处理StartExecution条形码的内容,例如调用相关方法 Console.WriteLine("StartExecution: " + data); } private void HandleEndExecution(string data) { // 在这里处理EndExecution条形码的内容,例如调用相关方法 Console.WriteLine("EndExecution: " + data); }
接下来,创建一个消息过滤器类,用于监听键盘消息:
[StructLayout(LayoutKind.Sequential)] public struct MSLLHOOKSTRUCT { public Point pt; public uint mouseData; public uint flags; public uint time; public IntPtr dwExtraInfo; } public delegate int LowLevelKeyboardProc(int nCode, IntPtr wParam, ref MSLLHOOKSTRUCT lParam); public static class GlobalHotkeys { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private const int WM_SYSKEYDOWN = 0x0104; private static LowLevelKeyboardProc _proc = HookCallback; private static IntPtr _hookID = IntPtr.Zero; public static void SetHook() { _hookID = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, IntPtr.Zero, AppDomain.CurrentThreadId); } public static void Unhook() { UnhookWindowsHookEx(_hookID); } [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hHook); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref MSLLHOOKSTRUCT lParam); private static int HookCallback(int nCode, IntPtr wParam, ref MSLLHOOKSTRUCT lParam) { if (nCode >= 0 && wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) { var keyData = lParam.pt.x; if (keyData == (int)'S' && lParam.flags == 0) // StartExecution { HandleStartExecution("Scanned Data"); } else if (keyData == (int)'E' && lParam.flags == 0) // EndExecution { HandleEndExecution("Scanned Data"); } } return CallNextHookEx(_hookID, nCode, wParam, ref lParam); } }
最后,在窗体加载时设置全局热键,并在窗体关闭时取消热键:
public fMain() { InitializeComponent(); GlobalHotkeys.SetHook(); // ... // 在窗体关闭时取消热键 this.FormClosing += (sender, e) => GlobalHotkeys.Unhook(); }
这样,当您扫描StartExecution或EndExecution条形码时,对应的处理方法会被调用。注意,这种方法依赖于特定的按键(在这个例子中是'S'和'E'),您可以根据实际的条形码内容调整这部分逻辑。
这是一个简化版的解决方案,可能需要根据具体需求进行调整。为了更好地适应不同的条形码内容,您可以考虑将条形码内容作为参数传递给
HandleStartExecution
和HandleEndExecution
方法,而不是固定字符串"Scanned Data"。解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 静电纺丝煅烧后如何得到柔性纤维
- ¥15 (标签-react native|关键词-镜像源)
- ¥100 照片生成3D人脸视频
- ¥15 伪装视频时长问题修改MP4的时长问题,
- ¥15 JETSON NANO
- ¥15 VS开发qt时如何在paintgl函数中用pushbutton控制切换纹理
- ¥20 关于 openpyxl 处理excel文件地问题
- ¥15 MS中不知道高分子的构型怎么构建模型
- ¥60 QQOP数据,什么是op数据号,怎么提取op数据!能不能大量提取(语言-c语言)
- ¥15 matlab代码 关于微分方程和嵌套的分段函数。