C# 输入表单时聚焦picturebox

C# 输入表单时聚焦picturebox,c#,winforms,picturebox,C#,Winforms,Picturebox,我正在用C#为学校创建一个简单的游戏,在这个游戏中,我使用WASD键控制一个角色。角色从精灵表中提取并放入imagelist中。imagelist在一个picturebox中 当它只是表单中的picturebox时,一切都很好,但是当我添加按钮或其他东西时,它就好像失去了焦点。它没有反应 我已经搜索了无数页,寻找一种在表单打开时将焦点设置在picturebox上的解决方案,但我没有找到任何有效的方法 我真的很感谢你的帮助 编辑:这是WinForms。PictureBox无法聚焦。它旨在作为一种显

我正在用C#为学校创建一个简单的游戏,在这个游戏中,我使用WASD键控制一个角色。角色从精灵表中提取并放入imagelist中。imagelist在一个picturebox中

当它只是表单中的picturebox时,一切都很好,但是当我添加按钮或其他东西时,它就好像失去了焦点。它没有反应

我已经搜索了无数页,寻找一种在表单打开时将焦点设置在picturebox上的解决方案,但我没有找到任何有效的方法

我真的很感谢你的帮助


编辑:这是WinForms。

PictureBox无法聚焦。它旨在作为一种显示图像的方式,但不允许用户通过键盘进行输入

一种粗略的方法是拦截表单本身上的OnKeyDown事件,然后测试感兴趣的键。只要具有焦点的控件(如按钮)不希望自己处理这些键,此操作就可以工作

更好的方法是重写表单的ProcessCmdKey()方法。在目标控件(如按钮)上调用此方法,以确定键是否特殊。如果按钮没有识别出它是特殊的,那么它将调用父控件。通过这种方式,表单级方法将为实际目标的每个非特殊键的按键调用。这允许按钮仍然处理用于按下按钮的ENTER键,但其他键将由表单处理

最后,要在表单上的任何控件处理所有键之前拦截它们,您需要实现IMessageFilter接口。像这样的

public partial class MyWindow : Form, IMessageFilter
{
    public MyWindow()
    {
        InitializeComponent();
        Application.AddMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m)
    {
        // WM_KEYDOWN
        if (m.Msg == 0x0100)
        {
            // Extract the keys being pressed
            Keys keys = ((Keys)((int)m.WParam.ToInt64()));

            // Test for the A key....
            if (keys == Keys.A)
            {
                return true; // Prevent message reaching destination
            }
        }
    }

    return false;
}

我发现带有pictureBox1\u Hover调用pictureBox1.Focus()的事件鼠标悬停有效。当鼠标悬停在有问题的图片框上时,它会获得焦点。除此之外,在表单加载期间调用pictureBox1.Focus()似乎对焦点没有任何影响

this.pictureBox1.MouseHover += new System.EventHandler(this.pictureBox1_Hover);
private void pictureBox1_Hover(object sender, EventArgs e)
        {
            pictureBox1.Focus();
        }

这对我有用

是的。我忘了写了,难道没有办法重写吗?我还应该如何移动我的角色?请提及重写表单的ProcessCmdKey()方法以获得答案。