让用户在 winform 弹出时开始输入,而无需单击文本框
Let user start typing when winform pops up without them having to click on the textbox
我正在 Visual Studio 中使用 C# 开发条码 reader 项目。我创建了一个 WinForm 应用程序并向其中添加了一个 RichTextBox。我希望用户在打开程序时能够开始扫描,而无需单击文本框。
提前致谢!
(我假设您有一个应用程序,里面有很多东西。但是有一个字段需要用扫描的条形码填写。)
我刚才遇到了一个类似的问题。我需要在 WPF 中捕获条形码。在加载中设置焦点 属性 似乎是个好主意,但因为页面上有许多其他控件可供用户单击等。焦点从一个控件跳到另一个控件,使条形码进入错误的字段或者消失在有焦点的网格中。
我们无法使用任何其他方式从扫描仪读取条形码,因为它也用于其他应用程序。它必须配置为输入。
我们想出了一个捕获按键的解决方案。
通过使用 keydown 事件,我们可以跟踪扫描仪输入,并声明如果在有限时间内输入超过 5 个键 + 我们的前缀和后缀它必须是条形码。
编辑:这里是 class.
的简化版本
public delegate void BarcodeRead(string barcode);
public class ManualReader
{
private string barcode = "no barcode detected";
private string possible = "";
private DateTime timestarted = DateTime.MinValue;
private Timer InputTimeout;
public BarcodeRead OnBarcodeRead;
public void OnKeyDown(object sender, KeyEventArgs.KeyEventArgs e)
{
//create timer if it does not exist
if (InputTimeout == null)
{
InputTimeout = new Timer(100);
InputTimeout.Enabled = true;
InputTimeout.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
//reset timer
InputTimeout.Stop();
InputTimeout.Start();
//possible barcode
possible += CharToKey.GetCharFromKey(e);
if (timestarted == DateTime.MinValue)
{
timestarted = DateTime.Now;
}
}
//Timer elapses
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
//Is it a barcode?
if ((timestarted.AddMilliseconds(600) > DateTime.Now) && (possible.Length > 5)
&& (timestarted != DateTime.MinValue) && possible.Contains("\r"))
{
barcode = possible;
barcode = barcode.Remove(0, 1);
barcode = barcode.Replace("\r", "");
//launch delegate
if (OnBarcodeRead != null)
{
OnBarcodeRead.Invoke(barcode);
}
}
//delete timers
timestarted = DateTime.MinValue;
InputTimeout.Dispose();
InputTimeout = null;
possible = null;
}
}
}
我知道对于非常短的超时,日期时间函数并不精确,但这个小 'hack' 仍然非常适合我们的应用程序。
您可以直接在元素中添加。这适用于文本框但不确定 RichTexBox
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"
我正在 Visual Studio 中使用 C# 开发条码 reader 项目。我创建了一个 WinForm 应用程序并向其中添加了一个 RichTextBox。我希望用户在打开程序时能够开始扫描,而无需单击文本框。 提前致谢!
(我假设您有一个应用程序,里面有很多东西。但是有一个字段需要用扫描的条形码填写。)
我刚才遇到了一个类似的问题。我需要在 WPF 中捕获条形码。在加载中设置焦点 属性 似乎是个好主意,但因为页面上有许多其他控件可供用户单击等。焦点从一个控件跳到另一个控件,使条形码进入错误的字段或者消失在有焦点的网格中。
我们无法使用任何其他方式从扫描仪读取条形码,因为它也用于其他应用程序。它必须配置为输入。
我们想出了一个捕获按键的解决方案。 通过使用 keydown 事件,我们可以跟踪扫描仪输入,并声明如果在有限时间内输入超过 5 个键 + 我们的前缀和后缀它必须是条形码。
编辑:这里是 class.
的简化版本public delegate void BarcodeRead(string barcode);
public class ManualReader
{
private string barcode = "no barcode detected";
private string possible = "";
private DateTime timestarted = DateTime.MinValue;
private Timer InputTimeout;
public BarcodeRead OnBarcodeRead;
public void OnKeyDown(object sender, KeyEventArgs.KeyEventArgs e)
{
//create timer if it does not exist
if (InputTimeout == null)
{
InputTimeout = new Timer(100);
InputTimeout.Enabled = true;
InputTimeout.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
//reset timer
InputTimeout.Stop();
InputTimeout.Start();
//possible barcode
possible += CharToKey.GetCharFromKey(e);
if (timestarted == DateTime.MinValue)
{
timestarted = DateTime.Now;
}
}
//Timer elapses
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
//Is it a barcode?
if ((timestarted.AddMilliseconds(600) > DateTime.Now) && (possible.Length > 5)
&& (timestarted != DateTime.MinValue) && possible.Contains("\r"))
{
barcode = possible;
barcode = barcode.Remove(0, 1);
barcode = barcode.Replace("\r", "");
//launch delegate
if (OnBarcodeRead != null)
{
OnBarcodeRead.Invoke(barcode);
}
}
//delete timers
timestarted = DateTime.MinValue;
InputTimeout.Dispose();
InputTimeout = null;
possible = null;
}
}
}
我知道对于非常短的超时,日期时间函数并不精确,但这个小 'hack' 仍然非常适合我们的应用程序。
您可以直接在元素中添加。这适用于文本框但不确定 RichTexBox
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"