2

我正在尝试从用户那里获取输入的值并将其保存在 char 变量中,但问题是什么都没有发生,我认为问题出在 Form Focus上,这是代码,当我运行它时没有发生错误,但也没有任何反应。我做错了什么?

        char keyPressed;

        public FrmZigndSC()
        {
            InitializeComponent();
            this.Focus();
        }

        private void FrmZigndSC_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            keyPressed = e.KeyChar;

            LblResult.Text += Convert.ToString(keyPressed);
        }
4

6 回答 6

2

您可以尝试使用此代码 - 基于KeyPressEventHandler

public FrmZigndSC()
{
       InitializeComponent();
       this.Focus();

       //Subscribe to event
       this.KeyPress += new KeyPressEventHandler(FrmZigndSC_KeyPress);
}


private void FrmZigndSC_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
        keyPressed = e.KeyChar;
        LblResult.Text += Convert.ToString(keyPressed);


        // Indicate the event is handled.
        e.Handled = true;
}
于 2012-09-17T12:59:18.340 回答
1

我试图在一个空的小 Windows 窗体项目中重现它。Shown这段代码在没有事件处理程序的情况下工作得很好:

public partial class FrmZigndSC : Form
{
    public FrmZigndSC()
    {
        InitializeComponent();

        this.KeyPress += (s, e) => this.LblResult.Text += e.KeyChar.ToString();

        // this might be a solution, but i did not need it
        this.Shown += (s, e) => this.Activate();
    }
}

无论如何,您都可以尝试使用this.Activate(),看看是否有帮助。如果您的表单上有其他输入控件(例如文本框),请尝试将表单的KeyPreview属性设置为 true。

于 2012-09-17T13:00:03.753 回答
1

如果您想从应用程序的消息管道接收关键通知,中继元素的焦点,在这种情况下,会使架构变得脆弱。您无法从应用程序中的其他表单中保证其中一个会被聚焦,或者该表单未被吸收该事件的某些控件所覆盖。你不能坚持一个有焦点的形式,因为它是完全糟糕的 UX 设计(即使这可能以 100% 的工作方式实现,也不是很确定)。

相反,您可以做的是声明派生自IMessageFilter的类:

public class MessageFilter : IMessageFilter
{
        const int WM_KEYDOWN = 0x100;
        const int WM_KEYUP = 0x101;

        public bool PreFilterMessage(ref Message m)
        {
            // Intercept KEY down message
            Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;

            if ((m.Msg == WM_KEYDOWN)
            {
                 //get key pressed  

                 return true;
            }        
            else
            {
                return false;
            }


        }
}

在您的应用程序中注册后:

MessageFilter filter = new MessageFilter(); //init somewhere 


Application.AddMessageFilter(filter ); // add 

..... 

//on application end don't forget to remove it 
Application.RemoveMessageFilter(filter );
于 2012-09-17T13:00:16.913 回答
0

使用 FocusManager 而不是 this.Focus() 应该可以解决问题!

http://msdn.microsoft.com/en-us/library/system.windows.input.focusmanager.aspx

于 2012-09-17T12:54:35.203 回答
0

我认为问题在于,当您的表单上有不同的控件时,它们会被按下。我的控件上的 DateTimePicker 也有同样的问题。

尝试删除所有这些,然后尝试它,它会工作。从那时起,再次添加控件以查看问题所在。

于 2012-09-17T13:00:04.963 回答
0

您提供的代码对我来说很好用。将启动页面设置为 FrmZigndSC 并重试。

于 2012-09-17T13:01:50.823 回答