【C#】【Form】キーイベント ~ KeyDown/KeyUp/KeyPress etc ~

■ キーイベント

1-1) KeyDown  : キーダウン
1-2) KeyPress : キー押下
1-3) KeyUp    : キーアップ

2) PreviewKeyDown : コントロールにフォーカスがある時にキーが押された場合、KeyDown イベント前に発生

■ サンプル

コントローラ構成

 * Form
  + KeyDownイベント
 * Label x 1

コード

using System;
using System.Windows.Forms;

namespace SampleDemo
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
      switch (e.KeyCode)
      {
        case Keys.S:
          if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
          {
            this.label1.Text = "Ctrl+Sキー押下";
          }
          else
          {
            this.label1.Text = "Sキー押下";
          }
          break;
        case Keys.Down:
          this.label1.Text = "下キー(↓)押下";
          break;
        case Keys.Up:
          this.label1.Text = "上キー(上)押下";
          break;
        case Keys.Right:
          this.label1.Text = "右キー(→)押下";
          break;
        case Keys.Left:
          this.label1.Text = "左キー(←)押下";
          break;
        default:
          break;
      }
    }
  }
}

■ 使用上の注意

 * Button等にフォーカスがあたっている場合、KeyDown/KeyUp/KeyPressイベントはそのままでは動かない

解決案

 * 通常のキーについて
 => 「KeyPreview = True」にしておく必要がある

 * 矢印キーなどについて
 => フォームのProcessDialogKeyメソッドをオーバーライドして、

【コントローラ構成・修正前】
 * Form
  + KeyDownイベント
 * Label x 1
 * Button x 1 <= 追加(Buttonにフォーカスがあたり、キーイベントが拾えなくなる)
【コントローラ構成・修正後】
 * Form
  + KeyDownイベント
  + KeyPreview = True
 * Label x 1
 * Button x 1
【コード】
using System;
using System.Drawing;
using System.Windows.Forms;

namespace SampleDemo
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    protected override bool ProcessDialogKey(Keys keyData)
    {
      switch (keyData)
      {
        case Keys.Down:
          this.label1.Text = "下キー(↓)押下";
          break;
        case Keys.Up:
          this.label1.Text = "上キー(上)押下";
          break;
        case Keys.Right:
          this.label1.Text = "右キー(→)押下";
          break;
        case Keys.Left:
          this.label1.Text = "左キー(←)押下";
          break;
        default:
          return base.ProcessDialogKey(keyData);
      }
      return true;
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
      switch (e.KeyCode)
      {
        case Keys.S:
          if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
          {
            this.label1.Text = "Ctrl+Sキー押下";
          }
          else
          {
            this.label1.Text = "Sキー押下";
          }
          break;
        default:
          break;
      }
    }
  }
}