首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转发KeyPress-事件

转发KeyPress-事件
EN

Stack Overflow用户
提问于 2009-07-06 16:48:41
回答 3查看 4.1K关注 0票数 2

我有一个TextBox,想从另一个表单转发一个KeyPress-event。

到目前为止,我有了我的表单:

代码语言:javascript
复制
private readonly Action<KeyPressEventArgs> m_KeyPress;

public KeyboardForm( Action<KeyPressEventArgs> keyPress )
{
  m_KeyPress = keyPress;
}

protected override void OnKeyPress( KeyPressEventArgs e )
{
  m_KeyPress( e );
  base.OnKeyPress( e );
}

和一个派生的TextBox,它初始化表单:

代码语言:javascript
复制
var keyboardForm = new KeyboardForm( OnKeyPress );
keyboardForm.Show();

现在,OnKeyPress-method会像预期的那样被调用(表单,然后是TextBox)。但不管怎样,什么也没发生。当我按下'a‘时,我预计我的TextBox中会出现一个'a’...

有没有人知道问题出在哪里?

它也不能与KeyDown一起工作,并且附加到常规的公开事件KeyPress对我也没有帮助。我认为,问题在于OnKeyPress的显式调用。是允许的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-07 03:37:55

Form1:

代码语言:javascript
复制
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Form2 f = new Form2();
        f.mEvent += new Form2.TestEvent(f_mEvent);
        f.Show();
    }

    void f_mEvent(KeyPressEventArgs e)
    {
        textBox1.Text += e.KeyChar;
    }
}

Form2:

代码语言:javascript
复制
public partial class Form2 : Form
{
    public delegate void TestEvent(KeyPressEventArgs e);
    public event TestEvent mEvent;

    public Form2()
    {
        InitializeComponent();
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (mEvent != null)
        {
            mEvent(e);
        }
        base.OnKeyPress(e);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2009-07-08 02:44:00

这应该可以做你想要的事情。使键盘窗体上的按钮文本基于SendKey characters。例如,如果想要小写a,只需将键盘按钮文本放入"a“即可。如果你想要一个退格键,只需要把“退格键”作为按钮的文本。所有键盘按钮单击事件都可以注册ButtonClick函数

键盘形式:

代码语言:javascript
复制
public partial class KeyboardForm : Form
{
    public delegate void ButtonPressed(string keyPressed);
    public event ButtonPressed ButtonPressedEvent;

    public KeyboardForm()
    {
        InitializeComponent();
    }

    private void ButtonClick(object sender, EventArgs e)
    {
        Button button = sender as Button;
        if (button != null)
        {
            if ((ButtonPressedEvent != null))
            {
                ButtonPressedEvent("{"+button.Text+"}");
            }
        }
    }
}

用户可在其中键入内容的带有文本框的表单:

代码语言:javascript
复制
public partial class Form1 : Form
{
    private KeyboardForm mKeyboardForm = new KeyboardForm();
    private bool mIsKeyboardCode = false;

    public Form1()
    {
        InitializeComponent();
        mKeyboardForm.ButtonPressedEvent += new KeyboardForm.ButtonPressed(KeyboardFormButtonPressedEvent);
    }

    void KeyboardFormButtonPressedEvent(string keyPressed)
    {
        mIsKeyboardCode = true;
        textBox1.Focus();
        SendKeys.SendWait(keyPressed.ToString());
        mKeyboardForm.Focus();
        mIsKeyboardCode = false;
    }

    private void TextBoxKeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.ControlKey)
        {
            if (!mKeyboardForm.Visible)
            {
                mKeyboardForm.Show(this);
                e.Handled = true;
            }
        }
        else if (!mIsKeyboardCode)
        {
            mKeyboardForm.Hide();
        }
    }
}

注意:我没有使用包含表单的扩展文本框。我认为在自定义文本框中显示/隐藏表单不是一个好的设计。

票数 1
EN

Stack Overflow用户

发布于 2018-12-09 05:32:05

来自这个答案:https://social.msdn.microsoft.com/Forums/windows/en-US/92215fdf-8be0-4e3a-b796-dd7c0f131666/keypreview-true-how-do-you-then-detect-enterreturn?forum=winforms

如果窗体上有一个捕捉Enter键按下的按钮,则可以使用以下代码将enter键作为普通的KeyPreview键进行处理:

代码语言:javascript
复制
void button_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    if (e.KeyData == Keys.Enter)
    {
        e.IsInputKey = true;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1088023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档