C#用户击键未注册

时间:2019-02-27 12:23:29

标签: c# input

我是一名初学者程序员,我正在尝试使用户能够使用WASD移动标签,但是它似乎不起作用,我已经潜入互联网寻求答案,毫无希望。为了记录,我使用的是Microsoft Visual Studio 2012。

这是用户密钥检测方法

internal class Input
    {
        private static Hashtable keyTable = new Hashtable();

        public static bool KeyPressed(Keys key)
        {
            if (keyTable[key] == null)
                return false;
            return (bool)keyTable[key];
        }
        public static void ChangeState(Keys key, bool state)
        {
            keyTable[key] = state;
        }
    }

以及用于在按键上实际移动东西的代码

private void moveObject(object sender, EventArgs e)
        {

            {
                if (Input.KeyPressed(Keys.A))
                {
                    label1.Location = new Point(label1.Location.X - 1, label1.Location.Y);
                    MessageBox.Show("test", "test");
                }
                if (Input.KeyPressed(Keys.D))
                {
                    label1.Location = new Point(label1.Location.X +1, label1.Location.Y);
                }
                if (Input.KeyPressed(Keys.S))
                {
                    label1.Location = new Point(label1.Location.X, label1.Location.Y-1);
                }
                if (Input.KeyPressed(Keys.W))
                {
                    label1.Location = new Point(label1.Location.X, label1.Location.Y+1) ;
                }
            }

在我看来,它应该可以在纸上工作,但是它什么也没做。

2 个答案:

答案 0 :(得分:1)

您可以右键单击moveObject方法并找到所有引用,这将帮助您找到此方法“处理”哪个事件。另外,您还可以在该方法中添加一个断点并执行“事件”,以查看是否实际调用了此方法。

答案 1 :(得分:0)

此答案假定您正在使用WinForms。

为什么不只使用内置事件?对于Form类,有一个KeyDown事件。然后,您可以使用KeyEventArgs类的KeyCode属性,该属性返回已按下的键。

现在您已经按下了什么键,请使用开关/大小写框来根据所按下的键分开操作。 (请记住,每个case块都必须以break;语句结尾。)每个case的参数都将针对switch参数进行测试。如果它们相同,则将运行给定的case块。否则,将跳过该案例块。例如,如果您按下“ A”按钮,则仅运行case Keys.A块。

然后使用Label的TopLeft属性来移动Label。 例如如果按W,则它应向上移动1个像素,这意味着Top属性应减少1。(Top是Label与窗口顶部之间的距离,Left是它到左边的距离。)

private void Form_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
    switch (e.KeyCode) {
         case Keys.W: { 
             label1.Top -= 1;
             break;
         }
         case Keys.A: { //do stuff on A button }
         case Keys.S: { //do stuff on S button }
         case Keys.D: { //do stuff on D button }
         default: { break; }
    }
}