让用户在 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}}"