C#でフォームにメニューバーを付けてみる。その4【ショートカットキー】

勝景奇覧上州妙義山之団扇絵 コンピュータ
出典:国立国会図書館「NDLイメージバンク」 (https://rnavi.ndl.go.jp/imagebank/)

.Net Framework(mono)でアプリケーションを作っていて、メニューを組み込み、メニューから呼び出される機能を実装していました。キーボードのショートカットキーでも、その機能を呼び出せると便利かと思いKeyDownイベントで押されたキーを調べて機能を呼び出すコードを書いていました。

調べたところメニューにショートカットキーを割り当てる機能があるので、態々イベント処理でキーを判定するルーチンを記述する必要が無いことを知りました。確認のためサンプルプログラムを書いていました。

ソース

using System;
using System.Windows.Forms;
/*
コンパイル
mcs Form1.cs -r:System.Windows.Forms.dll -r:System.Drawing.dll -out:SampleMenu.exe
実行
mono SampleMenu.exe
*/
namespace SampleMenu
{
    class Form1 : Form
    {
        public Form1()
        {
            // フォームサイズ
            this.Size = new System.Drawing.Size(800, 450);

            // メニューの初期化
            var menubar = new MenuStrip{ Height = 48, };

            var menuFile = new ToolStripMenuItem  { Text = "ファイル(&F)", };            
            menubar.Items.Add(menuFile);
            var menuEdit = new ToolStripMenuItem  { Text = " 編集 (&E)", };
            menubar.Items.Add(menuEdit);
            var menuHelp = new ToolStripMenuItem  { Text = "ヘルプ(&H)", };
            menubar.Items.Add(menuHelp);

            this.Controls.Add(menubar);

            var menuNew = new ToolStripMenuItem { Text = "新規作成", };
            menuNew.ShortcutKeys = Keys.Control | Keys.N;
            menuNew.ShowShortcutKeys = true;
            menuNew.Click += (sender, e) => MessageBox.Show(((ToolStripMenuItem)sender).Text);
            menuFile.DropDownItems.Add(menuNew);

            var menuOpen = new ToolStripMenuItem { Text = "開く", };
            menuOpen.ShortcutKeys = Keys.Control | Keys.O;
            menuOpen.ShowShortcutKeys = true;
            menuOpen.Click += (sender, e) => MessageBox.Show(((ToolStripMenuItem)sender).Text);
            menuFile.DropDownItems.Add(menuOpen);

            var menuSave = new ToolStripMenuItem { Text = "保存", };
            menuSave.ShortcutKeys = Keys.Control | Keys.S;
            menuSave.ShowShortcutKeys = true;
            menuSave.Click += (sender, e) => MessageBox.Show(((ToolStripMenuItem)sender).Text);
            menuFile.DropDownItems.Add(menuSave);

            var menuSaveAs = new ToolStripMenuItem { Text = "名前をつけて保存", };
            menuSaveAs.ShortcutKeys = Keys.Control | Keys.Shift | Keys.S;
            menuSaveAs.ShowShortcutKeys = true;
            menuSaveAs.Click += (sender, e) => MessageBox.Show(((ToolStripMenuItem)sender).Text);
            menuFile.DropDownItems.Add(menuSaveAs);

            var menuClose = new ToolStripMenuItem { Text = "終了", };
            menuClose.ShortcutKeys = Keys.Control | Keys.Q;
            menuClose.ShowShortcutKeys = true;
            menuClose.Click += (sender, e) => MessageBox.Show(((ToolStripMenuItem)sender).Text);
            menuFile.DropDownItems.Add(menuClose);

            var menuSearchFor = new ToolStripMenuItem { Text = "検索する" };
            menuSearchFor.ShortcutKeys = Keys.Control | Keys.F;
            menuSearchFor.ShowShortcutKeys = true;
            menuSearchFor.Click += (sender, e) => MessageBox.Show(((ToolStripMenuItem)sender).Text);
            menuEdit.DropDownItems.Add(menuSearchFor);
        }
        // エントリーポイント
        [STAThread]
        static void Main() => Application.Run(new Form1());
    }//class
}//ns

Mono環境でコンパイル

mcs Form1.cs -r:System.Windows.Forms.dll -r:System.Drawing.dll -out:SampleMenu.exe

Windows11で実行

.\SampleMenu.exe

「メニュー」→「ファイル(F)」をクリックすると各メニュー項目の右側にショートカットキーが表示されている。

メニュー項目をクリックするかショートカットキーを押すと、項目名がメッセージボックスに表示される。

サンプルは以上です。

今回はUbuntu上のMono環境でコンパイルし、出来上がった実行ファイル(.exe)をWindows11で実行しています。Ubntuで.exeファイルが実行できるのも変な感じですが、その.exeファイルがWindows11で実行できたことは、さらに変な感じがしました。

コメント