我正在尝试从用户获取输入的值并将其保存在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);
        }

#1楼 票数: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;
}

#2楼 票数: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。

#3楼 票数:1

如果你想从应用程序的消息管道接收一个关键通知,那么在这种情况下,转发元素的焦点会使架构变得脆弱。 你不能保证你的应用程序中的其他形式可能会集中注意力,或者表格不会被吸收该事件的某些控件覆盖。 你不能错过一个有焦点的形式,因为它是完全糟糕的用户体验设计(即使可以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 );

#4楼 票数:0

使用FocusManager而不是this.Focus()可以做到这一点!

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

#5楼 票数:0

我认为问题在于,当你的表单上有不同的控件来捕捉压缩。 我的控件上有一个带有DateTimePicker的问题。

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

#6楼 票数:0

你给的代码对我来说很好。 将启动页面设置为FrmZigndSC,然后重试。

  ask by Zignd translate from so

未解决问题?本站智能推荐:

1回复

MDI表格是否专注?

我有很多运气开发我的应用程序......直到现在。 我的应用程序的主要形式是MDI父级,我没想到在我的测试中添加任何MDI子项,直到今晚。 令我惊讶的是,MDI父母现在似乎永远不会“专注”。 永远不会调用Focus事件和OnFocus方法! 我的意思是......它似乎是专注的,但没
4回复

专注于第一个表格

我有两个表单form1和form2。 我使用form1中的按钮导航到form2。 在form2中我有一个按钮控件; 点击按钮,我显示messageBox。 当messageBox出现时它也失去了form1的焦点,但我希望它不应该失去form1的焦点。 我不关心form2。
1回复

如何设置哪个控件专注于应用程序启动

在C#/ Winforms中,如何在应用程序启动时设置默认焦点?
3回复

专注于滚动

我有一个带滚动条的用户控件(滚动条显示为包含的用户控件,它继承自Panel,太大了)。 当使用鼠标滚动一切都很好,但尝试使用鼠标滚动滚动不工作。 我的解决方案是在Scroll的事件处理程序中将焦点设置为我的子控件。 这有效。 现在的问题; 这会导致对childControl.Focu
4回复

无法在表格上设置标签

我有一些私有财产的表格 在一个方法中,我有一个称为SetupForm的方法 我收到一条错误消息,上面写着 错误1非静态字段,方法或属性TestApplication.ResultDialog.someText'X:\\ ResultDialog.cs需要对象引用50 13 Test
1回复

如何将表格设置为最高

我正在尝试做的只是将其上有一个图片框的位置设置为我计算机上最上面的对象,并保持这种状态。 我尝试使用f.topmost = true; 但是,如果我单击某些内容,则我的表单不再是最重要的。 我正在从dll运行我的表单(下面是dll的代码)。 我还尝试过在表单上添加加载内容,这也没有执行任
4回复

从旧表格访问以新表格设置的值

我有一个main形式。 在此有一个按钮。 当我单击此按钮时,将显示一个新表单,如下所示: 在此logForm我有一个'nud'和'Done_button'。 设置了nud值后,按“完成按钮”。 这将关闭此logForm而我又回到了main窗体。 我想要的是获取在主窗体的logFor
1回复

无法将取消按钮设置为表格?

我正在学习使用C#Windows窗体进行编程。 然后,我发现了cancelButton属性。 我尝试将此属性设置为我的表单,以便当我按ESC时将关闭我的表单。 但是,当我双击窗体属性中的cancelButton时,除了VS将Form1.cs标记为未保存之外,什么都没有发生。 双击后未创建