WindowsFormのキー入力イベントはどのコントロールに届けられるのか?

C# コンピュータ
C#

疑問点があります。

FormにToolStripContainerを載せて、そのToolStripContainerにMenuStripとPanelを載せています。
各コントロールはDockプロパティをFillにすることによりクライアント領域一杯に広げています。

そのFormに特定のキー入力に対応して全画面表示の機能を付与したいのですが、キー入力のイベントはどのコントロールに届けられるのでしょうか?

確認用プログラム

using System;
using System.Windows.Forms;
using System.Drawing;

class ToolStripTest
{
    // アプリケーションのエントリポイント
    [STAThread]
    static void Main()
    {
        Application.Run(new Form1());
    }
}
class Form1 : Form
{
    ToolStripContainer toolStripContainer = new ToolStripContainer{
        // プロパティの初期化
        BackColor = Color.Green,    // 背景色
        Dock = DockStyle.Fill   // クライアント領域全体に広げる
    };

    MenuStrip menuBar = new MenuStrip {
        // プロパティの初期化
        BackColor = Color.Yellow,    // 背景色
        Dock = DockStyle.Fill   // クライアント領域全体に広げる
    };

    Panel contentPanel = new Panel {
        // プロパティの初期化
        BackColor = Color.Blue,    // 背景色
        Dock = DockStyle.Fill,   // クライアント領域全体に広げる
    };

    // コンストラクタ
    public Form1()
    {
        toolStripContainer.TopToolStripPanel.Controls.Add(menuBar);
        toolStripContainer.ContentPanel.Controls.Add(contentPanel);
        Controls.Add(toolStripContainer);

        this.KeyDown += (sender, e) => {
            Console.WriteLine("formで補足:{0}", e.KeyCode);
        };
        toolStripContainer.KeyDown += (sender, e) => {
            Console.WriteLine("toolStripContainerで補足:{0}", e.KeyCode);
        };
        menuBar.KeyDown += (sender, e) => {
            Console.WriteLine("menuBarで補足:{0}", e.KeyCode);
        };
        contentPanel.KeyDown += (sender, e) => {
            Console.WriteLine("contentPanelで補足:{0}", e.KeyCode);
        };

    }
}

実行してみます。

黄色がmenuBar青がpanelで緑がtoolStripContainerなのですが、menuBarとpanelに隠れて緑色は見えません。

適当なキーを押してみます。

toolStripContainerで補足:F11
toolStripContainerで補足:D1

ToolStripContainerにイベントが届られています。
Formより手前にあるControlだからといえば理解できますが、その理屈だとPanelやmenuBarに通知が届かないのは謎です。
MSDNを調べたころPanelのKeyDownイベントは無効だそうです。存在するが無効とはこれはどういうことなんでしょう?
menuBarのMenuStripは特別KeyDownイベントを妨げる記述は見つけられませんでした。

色々なキーを押してみて気が付いたのですが、「Alt」キーを押してみます。

toolStripContainerで補足:Menu


以降キーを入力するとmenuBar(MenuStrip)でイベントが補足されるようになります。

menuBarで補足:D1
menuBarで補足:D1


再び「Alt」キーを押すとtoolStripContainerに戻ります。

「Alt」を押すことでmenuBarにfocusが移動したことによりイベントの通知先が変更されたとして、メニューをキー操作するには都合の良い振る舞いですが、いまひとつイベントの通知の流れが腹落ちしない感じです。

調べれば答えは見つかりそうですが、理屈を知ったとしてもプログラムを組む場合実地でテストが必須ですので、そのままにして置くことにします。

コメント