Ctrl + PageUp / Down做了什么奇怪的事情?

时间:2013-01-24 18:43:02

标签: c# winforms custom-controls onkeydown

我正在Windows窗体中实现自己的控件。这是一个树视图,所以我必须实现导航键:箭头,页面向上/向下以及它们与shift和control的组合以处理多选。

最近我发现,Ctrl + PageUp / PageDown的组合做了一些奇怪的事情。主要是,它不会触发OnKeyDown(仅捕获ControlKey)。此外,在我用鼠标单击控件之前没有捕获其他键(看起来它失去了焦点)我实现了IsInputKey:

    protected override bool IsInputKey(Keys keyData)
    {
        // Capture arrow keys
        if ((keyData & (Keys.Up | Keys.Down | Keys.Left | Keys.Right | 
            Keys.PageDown | Keys.PageUp | Keys.ControlKey | Keys.Control)) != 0)
            return true;
        else
            return base.IsInputKey(keyData);
    }

OnKeyDown处理程序没有什么特别之处。

发生了什么事?

1 个答案:

答案 0 :(得分:1)

您的代码确实有效。我正在接收OnKeyDown操作:

protected override void OnKeyDown(KeyEventArgs e) {
  if (e.KeyData == (Keys.Control | Keys.PageDown)) {
    // Control + Page Down
  } else if (e.KeyData == Keys.PageDown) {
    // Page Down
  }
  base.OnKeyDown(e);
}

以下是您的代码的精简版本:

public class VirtualTreeView : UserControl {

  protected override void OnKeyDown(KeyEventArgs e) {
    if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.PageUp || e.KeyCode == Keys.PageDown || e.KeyCode == Keys.Home || e.KeyCode == Keys.End) {
      if (e.Control) {
        MessageBox.Show("Ctrl - " + e.KeyCode.ToString());
      }
    } else
      base.OnKeyDown(e);
  }

  protected override bool IsInputKey(Keys keyData) {
    // Capture arrow keys
    if ((keyData & (Keys.Up | Keys.Down | Keys.Left | Keys.Right | Keys.PageDown | Keys.PageUp | Keys.ControlKey | Keys.Control)) != 0)
      return true;
    else
      return base.IsInputKey(keyData);
  }
}

按Control-PageUp显示一个消息框。