You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WM_KEYDOWN键码为条码/二维码扫描器生成UTF8字符串

拦截WM_KEYDOWN消息解码二维码扫描字符串的问题

我开发的生产应用允许客户使用任意标准USB条码扫描器搜索商品,这类设备本质是模拟键盘输入的设备,会向聚焦的WinForms控件(如TextBox)发送与键盘输入一致的消息,只是输入速度更快。在记事本、写字板或WinForms文本框中扫描二维码时,无需额外代码就能直接识别。

但新版本添加二维码支持后,由于传入的字符串结构更复杂,出现了解码异常的问题。

当前核心需求是:即使没有聚焦的文本框接收按键消息,应用仍需可靠检测到条码扫描并执行查询。我为主窗体安装了MessageFilter,拦截WM_KEYDOWN消息后将键码添加到Buffer类中,通过按键速率区分人工输入与扫描输入——速率检测逻辑运行正常,但二维码的原始格式导致消息解码出现异常。

目前我通过将字符传入一个专用的虚拟TextBox控件解决了问题,但这只是临时方案,我希望了解TextBox内部的字符处理逻辑,直接构建出正确的UTF8字符串,而非依赖虚拟控件。

功能需求

  • 人工输入01234566789时,文本框正常回显该字符串
  • 扫描0123456789时,弹出消息框
  • 检测到扫描操作后,若存在聚焦控件,需移除其中的扫描文本

问题版本Buffer代码

class Buffer
{
    public Buffer(Form owner) { }
    StringBuilder _sbScan = new StringBuilder();
    public void Append(char @char)
    {
        _sbScan.Append(@char);
    }
    public string Text => _sbScan.ToString();
    public int Length => _sbScan.Length;
    public void Clear() => _sbScan.Clear();
}

临时方案Buffer代码(继承TextBox)

class Buffer : TextBox
{
    public Buffer(Form owner)
    {
        // 必须可见并归主窗体所有才能正常工作
        Size = new Size();
        owner.Controls.Add(this);
    }
    public void Append(char @char) => Text.Append(@char);
    public int Length => TextLength;
}

内容的提问来源于stack exchange,提问作者IV.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:01:05