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

C#中如何绕过扫码后的回车键触发,直接将值传入URL?

问题描述

我开发了一款Windows应用,用户完成游戏化流程后会显示二维码。用连接到Windows设备的USB扫描器扫描该二维码后,会生成带认证ID(Auth ID)或会话ID(Session ID)等参数的URL。

现在的问题是:如何绕过扫描二维码后触发的ENTER按键事件?

当前逻辑必须按下ENTER键,参数才会拼接到URL中。我希望扫描完成后直接处理,不用触发回车键就能把参数加到URL里并执行后续流程。

当前实现代码

private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    //Keydown
    TextBox tb = (TextBox)sender;
    string url = "";
    if (e.Key == Key.Enter && tb.Text.Length > 10 && onlineStatus) //  
    {
        if ((tb.Text.Substring(0, 7) == "http://") || (tb.Text.Substring(0, 8) == "https://"))
        {
            url = tb.Text;
        };
        if ((tb.Text.Substring(0, 7) == "http>>&&") || (tb.Text.Substring(0, 8) == "https>>&&"))
        {
            url = convertString(tb.Text);
        }
        LoggerApp.Add("TextBox_KeyDown in url=" + tb.Text);
        LoggerApp.Add("TextBox_KeyDown out url=" + url);
        if (url.Contains("SOME-URL-HERE.at"))
        {
            Console.Write("SENDER-HERE " + sender);
            browser.Visibility = Visibility.Visible;
            scanerReadStatus = true;
            onShowVideoStatus = false;
            RestarttimerUserActivity();
            NavigateApp(url, "");
            tb.Text = "";
        }
    }
}
解决方案

USB扫描器本质是模拟键盘输入,要么改扫描器硬件设置取消Enter后缀,要么从代码层面适配,以下是具体方法:

方法1:监听TextChanged事件,通过输入间隔判断扫描完成

扫描器输入速度远快于手动输入,可设置短定时器,当输入停止超过阈值时判定扫描完成,触发处理逻辑:

private System.Timers.Timer _scanTimer;
private string _lastScannedText = "";

public YourWindow()
{
    InitializeComponent();
    // 100ms延迟:扫描器连续输入间隔远小于这个值,手动输入会超过
    _scanTimer = new System.Timers.Timer(100);
    _scanTimer.Elapsed += ScanTimer_Elapsed;
    _scanTimer.AutoReset = false;
}

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    TextBox tb = (TextBox)sender;
    if (tb.Text.Length <= 10 || !onlineStatus) return;

    // 文本变化时重置定时器
    if (_lastScannedText != tb.Text)
    {
        _lastScannedText = tb.Text;
        _scanTimer.Stop();
        _scanTimer.Start();
    }
}

private void ScanTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // 回到UI线程处理界面操作
    Dispatcher.Invoke(() =>
    {
        TextBox tb = yourTextBox; // 替换成你的TextBox实例
        string url = "";
        string inputText = tb.Text;

        if (inputText.StartsWith("http://") || inputText.StartsWith("https://"))
        {
            url = inputText;
        }
        if (inputText.StartsWith("http>>&&") || inputText.StartsWith("https>>&&"))
        {
            url = convertString(inputText);
        }

        LoggerApp.Add("TextBox_TextChanged in url=" + inputText);
        LoggerApp.Add("TextBox_TextChanged out url=" + url);

        if (!string.IsNullOrEmpty(url) && url.Contains("SOME-URL-HERE.at"))
        {
            Console.Write("SENDER-HERE " + tb);
            browser.Visibility = Visibility.Visible;
            scanerReadStatus = true;
            onShowVideoStatus = false;
            RestarttimerUserActivity();
            NavigateApp(url, "");
            tb.Text = "";
            _lastScannedText = "";
        }
    });
}

方法2:改造KeyDown事件,支持无Enter触发

保留原有KeyDown逻辑的同时,增加文本格式校验,只要输入内容符合URL规则就直接处理,无需等待Enter键:

private void TextBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    TextBox tb = (TextBox)sender;
    string url = "";
    bool shouldProcess = false;

    // 两种触发条件:按下Enter键,或者文本已符合扫描内容规则
    if ((e.Key == Key.Enter || IsValidScanContent(tb.Text)) && tb.Text.Length > 10 && onlineStatus)
    {
        shouldProcess = true;
        // 如果是Enter键触发,拦截事件避免默认行为
        if (e.Key == Key.Enter)
        {
            e.Handled = true;
        }
    }

    if (shouldProcess)
    {
        if (tb.Text.StartsWith("http://") || tb.Text.StartsWith("https://"))
        {
            url = tb.Text;
        };
        if (tb.Text.StartsWith("http>>&&") || tb.Text.StartsWith("https>>&&"))
        {
            url = convertString(tb.Text);
        }
        LoggerApp.Add("TextBox_KeyDown in url=" + tb.Text);
        LoggerApp.Add("TextBox_KeyDown out url=" + url);
        if (url.Contains("SOME-URL-HERE.at"))
        {
            Console.Write("SENDER-HERE " + sender);
            browser.Visibility = Visibility.Visible;
            scanerReadStatus = true;
            onShowVideoStatus = false;
            RestarttimerUserActivity();
            NavigateApp(url, "");
            tb.Text = "";
        }
    }
}

// 校验扫描内容格式
private bool IsValidScanContent(string text)
{
    return (text.StartsWith("http://") || text.StartsWith("https://") || 
            text.StartsWith("http>>&&") || text.StartsWith("https>>&&"));
}

方法3:修改扫描器硬件设置

大部分USB扫描器自带配置二维码,扫描对应配置码可以取消扫描后的ENTER后缀。查看扫描器说明书,找到「取消输出后缀」或「无后缀模式」的配置码,扫描后扫描器就不会自动发送Enter键,此时直接用TextChanged事件处理即可。

内容的提问来源于stack exchange,提问作者Robert S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:46