C#_特殊キーをクリックしたら処理を走らせる

ProcessDialogKey をオーバーライドするもよう。以下ただのコピペした記事。

 

以下の ProcessDialogKey を Form1 のコードに記述したら、
特定キーを押したときの処理が走った。
なお、イベントの KeyDown などは書いていない。

 

    namespace Hoge
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
           
            protected override bool ProcessDialogKey(Keys keyData)
            {
                switch (keyData)
                {
                    case Keys.Right:
                        button1.Focus();
                        //処理 自作関数も呼べる
                        break;
                   
                    case Keys.Left:
                        button2.Focus();
                        //処理
                        break;
                   
                    case Keys.Up:
                        //処理
                        break;
                   
                    default:
                        return base.ProcessDialogKey(keyData);
                }
                return true;
                // キー本来の処理をさせたくないなら true を返す。
                // ex ) 矢印キーでフォーカスを移動させたくないなら
                //      true を返すようにする。
            }
        }
    }

ProcessDialogKey
ダイアログキーを処理する。
true : キーがコントロールによって処理された場合。
false : それ以外の場合。

 

--詳しく--

タブ、esc キー、矢印キーなどダイアログ文字を処理するメッセージの
プリプロセス時に呼び出される。
※コントロールがキーを処理していないことを
  IsInputKey メソッドが示した場合のみに呼び出される。?

ProcessDialogKey は「コントロール → フォーム」の順で呼ばれる。
独自にキーを処理した場合、それを示す為に戻り値で ture を返すようにする。
コントロールとは panel やら textBox のこと多分。

 

コントロールProcessDialogKey メソッドは、
コントロールPreProcessMessage メソッドから暗黙的に呼び出される。
そのため、
プリプロセス工程の最初のメソッドである
コントロールPreProcessMessage メソッドをオーバーライドしても、
同様にプリプロセス工程でのキー処理をカスタマイズできる。

しかし、
コントロールProcessDialogKey メソッドや PreProcessMessage メソッドを
オーバーライドする方法を採用する場合、
当然、コントロール継承が必要になる。

 

以下のクラスを作成し、ButtonEx.XXXX と使うのかと。分からん。

    using System;
    using System.Windows.Forms;
        public class ButtonEx : Button
        {
            [System.Security.Permissions.UIPermission(
                System.Security.Permissions.SecurityAction.Demand,
                Window = System.Security.Permissions.UIPermissionWindow.AllWindows)]
            protected override bool ProcessDialogKey(Keys keyData)
            {
                //左キーが押されているか調べる
                if ((keyData & Keys.KeyCode) == Keys.Left)
                {
                    MessageBox.Show("左キーが押されました。");
                    //return true;
                }
                return base.ProcessDialogKey(keyData);
            }
        }

 

IsInputKey でも書いてみたが想定通りに動かなかった...。
IsInputKey:
指定されているキーが、通常の入力キーであるかか、
またはプリプロセスを必要とする特殊なキーであるかを確認。
通常の入力キー : true
それ以外:false

 

こちらから。
http://www.atmarkit.co.jp/fdotnet/dotnettips/241windlgkey/windlgkey.html
https://dobon.net/vb/dotnet/control/btndetectarraykey.html
http://d.hatena.ne.jp/Csh/20100324/1269430687
https://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.isinputkey(v=vs.110).aspx

 

以上。