C#为什么我的控件不接受KeyDown事件

时间:2016-04-21 07:03:30

标签: c# user-controls

好的家伙所以我一直在研究这个控件近一个月,我遇到的一个问题是,如果我按下CTRL键,它会自动注册,如果按空格键,它是自我注册的。我试图将两者分开,我试图在同一if语句中使用它们。两者都不成功。

我的第一次尝试是这样的

protected override void OnKeyDown(KeyEventArgs e)
    {
        // base.OnKeyDown(e);
        if (_isEditing)
        {
            if (e.KeyData == Keys.Delete)
            {
                if (_selectedObj != null)
                {
                    DeleteSelectedObject();
                }
            }
        }
        if (e.Control && e.KeyData == Keys.Space)
        {
            _isEditing = !_isEditing;
            Invalidate();
        }
    }

现在,如果我从等式中删除Ctrl或'Space'键,它可以正常工作。所以我试着将它们分开并提出

protected override void OnKeyDown(KeyEventArgs e)
    {
        // base.OnKeyDown(e);
        if (_isEditing)
        {
            if (e.KeyData == Keys.Delete)
            {
                if (_selectedObj != null)
                {
                    DeleteSelectedObject();
                }
            }
        }
        if (e.Control)
        {
            Console.WriteLine(DateTime.Now.ToShortTimeString());
            if (e.KeyData.Equals(Keys.Space))
            {
                _isEditing = !_isEditing;
                Console.WriteLine(DateTime.Now.Ticks.ToString());
            }
            Invalidate();
        }
    }

使用Console.WriteLine()作为骗子告诉我何时按下按键并且Ticks不会显示,除非我注释掉CTRL子句。我在哪里错了?

2 个答案:

答案 0 :(得分:2)

尝试类似

的内容
if (e.Modifiers == Keys.Control && e.KeyCode == Keys.Space)
{

}

答案 1 :(得分:0)

您在KeyDown事件中无法获得修饰符。而是尝试以下方法之一来了解是否按下了修改器(Ctrl,Shift,Alt):

  1. Keyboard.IsKeyDown

    if ((Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift))  
        &&  e.KeyData == Keys.Space){}
    
  2. 检查Keyboard.Modifiers

    if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
         && e.KeyData == Keys.Space){}