Windows.Formsにボタンやチェックボックスなどを貼り付けるとKeyDownが捕捉できなくなります。貼り付けたボタンやチェックボックスにフォーカスをもっていかれるためにFormでKeyDownイベントが発生しなくなるのです。
対策としては貼り付けたコントロールにフォーカスをもっていかれないように
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class CheckBox2 : CheckBox { public CheckBox2() { SetStyle(ControlStyles.Selectable, false); } } public class Button2 : Button { public Button2() { SetStyle(ControlStyles.Selectable, false); } } |
として、これを貼り付ける方法がありますが、テキストボックスの場合はこの方法は使えません。
それからProcessDialogKeyメソッドをオーバーライドする方法もあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } protected override bool ProcessDialogKey(Keys keyData) { if((keyData & Keys.KeyCode) == Keys.Left) { // 左キーが押されている // そのキーの本来の処理をさせたくないときは、trueを返す return true; } else if((keyData & Keys.KeyCode) == Keys.Right) { // 右キーが押されている return true; } return base.ProcessDialogKey(keyData); } |
ところがもっと簡単な方法がありました。
それは
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); KeyPreview = true; } protected override bool ProcessDialogKey(Keys keyData) { // falseを返す。trueではうまくいかない。 return false; } protected override void OnKeyDown(KeyEventArgs e) { // これで捕捉できる base.OnKeyDown(e); } protected override void OnKeyUp(KeyEventArgs e) { // これで捕捉できる base.OnKeyUp(e); } } |
最初に KeyPreview = trueとしておけばKeyUpイベントは捕捉できます。KeyDownイベントも捕捉するのであればProcessDialogKeyのオーバーライド(常にfalseを返す)が必要です。