搜索页 2024-05-23 13:32 采纳率: 61.5%
浏览 92

C# Win Form窗体USB扫码枪扫描条形码问题

窗体描述:
在一个窗体里面,fMain.cs
有4个输入框TextBox,1个数字输入框NumericUpDown,都有回车事件。
有2个PrictureBox,放置条形码,条码内容分别为StartExecution和EndExecution
操作描述:
上述5个输入框安装顺序垂直排列,焦点在一个文本框,扫码枪扫描获取内容回车触发文本框事件验证数据,数据正确则焦点跳入下一文本框,直到焦点到最后一个输入文本框。这是输入数字后,扫描任意一个条形码,获取条形码内容 直接执行对应方法。
问题描述:
如何实现全局监视获取条形码的内容?且无需获取焦点位置,扫描条形码后直接执行方法即可。

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-23 13:32
    关注

    引自免费微信小程序:皆我百晓生

    为了解决您的问题,我们需要在窗体中添加一个全局的热键监听器,以便在任何时候都能捕获到条形码扫描后的结果。这里我们将使用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'),您可以根据实际的条形码内容调整这部分逻辑。

    这是一个简化版的解决方案,可能需要根据具体需求进行调整。为了更好地适应不同的条形码内容,您可以考虑将条形码内容作为参数传递给HandleStartExecutionHandleEndExecution方法,而不是固定字符串"Scanned Data"。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月23日

悬赏问题

  • ¥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代码 关于微分方程和嵌套的分段函数。