■ キーイベント
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; } } } }
参考文献
公式サイト
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/how-to-handle-keyboard-input-at-the-form-levelKeyDown/KeyUp/KeyPress
https://dobon.net/vb/dotnet/control/keyevent.htmlhttps://dobon.net/vb/dotnet/system/modifierkeys.html
https://dobon.net/vb/dotnet/form/keypreview.html
https://dobon.net/vb/dotnet/form/keypreview2.html
http://www.atmarkit.co.jp/fdotnet/dotnettips/229parentkeyproc/parentkeyproc.html
PreviewKeyDown
https://dobon.net/vb/dotnet/control/btndetectarraykey.htmlhttp://www.atmarkit.co.jp/fdotnet/dotnettips/241windlgkey/windlgkey.html