1

Windows フォームで独自のコントロールを実装しています。これはツリービューなので、ナビゲーション キーを実装する必要があります。矢印、ページ アップ/ダウン、および複数選択を処理するためのシフトとコントロールとの組み合わせです。

最近、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 ハンドラには特別なことはありません。

何が起こっている?

4

1 に答える 1

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 を押すと、メッセージ ボックスが表示されます。

于 2013-01-24T20:03:46.047 に答える