さてさて、今日はC#のお話です。
WIndowsでは様々なショートカットキーがありますよね。
私はキーボード派なのでショートカットキーが大好きです。

自分で制作したアプリには是非ショートカットキーを実装したいところ。
特に、タスクトレイに常駐するようなアプリの場合は相性もいいですし、
逆に必須な機能だとも言えます。

という事で、今回はC#でショートカットキーを設定する方法です。
厳密には、タスクトレイに常駐しているアプリがWindows上で押されたショートカットキーを受け取る為の仕組みなので、ホットキーと言いますね。

簡単な手順を説明すると、

    1. DLLを利用するためのライブラリをインポートする
    2. 各種キー等の定数を宣言する
    3. 登録用Win32関数、登録解除用 Win32関数を宣言する
    4. RegisterHotKey Win32関数にてホットキーを登録する
    5. WndProcをオーバーライドし、OSからのキー入力をフックする
    6. 不要になったタイミングで(Formを閉じるとか、アプリを終了するとか)UnregisterHotKeyを呼び出し登録解除する

まず最初に、ホットキーの登録、登録削除をするためにはWin 32 SDKを使います。
そのために必要なライブラリをインポートする必要がありますので、

using System.Runtime.InteropServices ;

を、対象フォームに宣言します。
次に各種定数です。

ネイティブWin32 SDKなVC++で無い限り、Windowsで利用するキー値やハンドルが受け取るmessegeは定数として値を宣言する必要があります。

        const int MOD_ALT = 0x0001;
        const int MOD_CONTROL = 0x0002;
        const int MOD_SHIFT = 0x0004;
        const int MOD_WIN = 0x0008;
        const int WM_HOTKEY = 0x0009;

まぁ、これくらい登録しておけば良いでしょう。
意味はなんとなくわかりますよね?
上から順に、ALTキー、CTRLキー、shiftキー、Winキーで、一番下の「WM_HOTKEY」は、
ホットキーが押されたよーというメッセージをOSから受け取る為の値です。
ちなみに、このWM_HOTKEYは0x0000~0xbfff 内の適当な値で良いそうです。

あとはホットキーを設定する為のWin32関数を宣言します。

        [DllImport("user32.dll")]
        extern static int RegisterHotKey(IntPtr HWnd, int ID, int MOD_KEY, int KEY);

        [DllImport("user32.dll")]
        extern static int UnregisterHotKey(IntPtr HWnd, int ID);


次にホットキーの登録です。
関数の呼び出しは簡単

RegisterHotKey(this.Handle, WM_HOTKEY ,MOD_CONTROL | MOD_WIN, (int)Keys.T);

まず第1引数this.Handleで、コールバック関数が呼び出されるフォームのハンドルを指定しています。
次に第2引数では、このホットキーが押されたときに第1引数のフォームにメッセージを送信する値です。

次に第3引数ですが、上記定数で指定したMOD_**** の値を組み合わせて設定します。
複数ある場合は|で繋いで指定することが可能です。

次に第4引数では、実際に押されるキーの値を指定します。

ちなみに上記例ではCTRL + WIN + Tが押されたときのホットキーを登録しています。

次に受け取り側の処理です。
OSから渡されるメッセージ処理を、WndProcという関数をオーバーライドして処理します。

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_HOTKEY)
            {
                if ((int)m.WParam == HOTKEY_ID)
                {
                    // ホットキーが押されたときの処理
                    Console.WriteLine("HOTキーが押されました");
                }
            }
        }

このWndProc関数を設定すると、Formに対するすべてのメッセージを受け取ることになるので、
if (m.Msg == WM_HOTKEY) というような形で押されたキーがHOTキーであるかを検証します。

後は後処理として画面を閉じる時などに

 UnregisterHotKey(this.Handle, HOTKEY_ID);

を指定すればOKです。

こうすることにより、設定したHOTキーを押される度にイベントを受け取ることが可能になります。







Visual C#.netではじめるネットワ-クプログラミング(1(基礎編)) [ 趙森 ] Visual C#.netではじめるネットワ-クプログラミング(1(基礎編)) [ 趙森 ]

【1000円以上送料無料】Visual C#.netではじめるネットワークプログラミング 2/趙森 【1000円以上送料無料】Visual C#.netではじめるネットワークプログラミング 2/趙森