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
相关产品推荐
相关产品推荐

