事件处理程序 C# 中的共享变量

Shared variable within event handlers C#

我创建了一个自定义文本框,当输入来自 RFID reader(使用 HID ID 定义)时,它能够不接受输入。我有 HID ID,我有两个事件,我有要设置的 属性,但它不起作用。

代码如下:

public partial class STextBox : TextBox
{
    private RawInput _kblistener;
    private bool _handle = false;

    public STextBox()
    {
        _allowRfid = false;
        _kblistener = new RawInput(Handle, true);
        _kblistener.KeyPressed += _kblistener_KeyPressed;
    }

    private void _kblistener_KeyPressed(object sender, RawInputEventArg e)
    {
        if (e.KeyPressEvent.DeviceName == Config.RFIDreader) Handling = true;
        else Handling = false;
    }

    private bool Handling
    {
        get { return _handle; }
        set { _handle = value; }
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        e.Handled = Handling;
        base.OnKeyPress(e);
    }
}

问题是:第一个触发事件是_kblistener_KeyPressed,它在需要时将Handling 设置为true,但是当代码到达OnKeyPress 时,Handling 始终为false。我正在使用 RawInput_dll 获取 HID ID。

好的。所以感谢 Hans Passant,我发现问题出在非静态变量上。 在我将 _kblistener_handle 更改为静态后,一切都开始正常工作,正如我预期的那样。

这是工作代码:

public partial class STextBox : TextBox
{
    private bool _allowRfid;
    private static RawInput _kblistener;
    private static bool _handle = false;

    public STextBox()
    {
        _allowRfid = false;
        _kblistener = new RawInput(Handle, true);
        _kblistener.KeyPressed += _kblistener_KeyPressed;
    }

    private void _kblistener_KeyPressed(object sender, RawInputEventArg e)
    {
        if (e.KeyPressEvent.DeviceName == SetUp.RfidDevID) Handling = true;
        else Handling = false;
    }

    public bool AllowRFID
    {
        get { return _allowRfid; }
        set { _allowRfid = value; }
    }

    private static bool Handling
    {
        get { return _handle; }
        set { _handle = value; }
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (!_allowRfid) e.Handled = Handling;
        base.OnKeyPress(e);
    }
}