ToolStripMenuItem の ShortcutKeys に指定したショートカットキーは、 ContainerControl の、 ProcessCmdKey で実行されます。
Form は、ContainerControl の派生クラスで、ProcessCmdKey は virtual なので、Form の ProcessCmdKey でオーバーライドできます。
フォーカスのあるコントロールによって挙動を変化させたいショートカットキーは、メニューの ShortcutKeys に指定しないで、各コントロールの ProcessCmdKey で処理すると良いでしょう。メニューにショートカットキーを処理させずに、テキストだけ表示するには、ShortcutKeyDisplayString を使います。
詳しい方法は、c# ショートカットキーを正しく処理するには? をご覧ください。
ShortcutKeys に Ctrl+O を指定、コマンドハンドラで、スタックトレースを調べます。
UnitTest.TestMenuShortcutKeys+FormMenuTestShortcutKeys::Open_Click System.Windows.Forms.ToolStripItem::RaiseEvent System.Windows.Forms.ToolStripMenuItem::OnClick System.Windows.Forms.ToolStripItem::HandleClick System.Windows.Forms.ToolStripItem::FireEventInteractive System.Windows.Forms.ToolStripItem::FireEvent System.Windows.Forms.ToolStripMenuItem::ProcessCmdKey System.Windows.Forms.ToolStripManager::ProcessShortcut System.Windows.Forms.ToolStripManager::ProcessCmdKey System.Windows.Forms.ContainerControl::ProcessCmdKey System.Windows.Forms.Form::ProcessCmdKey System.Windows.Forms.Control::PreProcessMessage System.Windows.Forms.Control::PreProcessControlMessageInternal System.Windows.Forms.Application+ThreadContext::PreTranslateMessage System.Windows.Forms.Application+ThreadContext::System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage System.Windows.Forms.Application+ComponentManager::System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop System.Windows.Forms.Application+ThreadContext::RunMessageLoopInner System.Windows.Forms.Application+ThreadContext::RunMessageLoop System.Windows.Forms.Application::Run UnitTest.TestMenuShortcutKeys::Test UnitTest.Program::Test UnitTest.Program::Main
Open_Click がハンドラです。Form の ProcessCmdKey からハンドラが呼ばれていることがわかります。
using System; using System.Windows.Forms; namespace UnitTest { class TestMenuShortcutKeys : Tester { class FormTestMenuShortcutKeys : Form { public FormTestMenuShortcutKeys() { menuStrip = new MenuStrip(); menuItemOpen = new ToolStripMenuItem(); // レイアウト停止 // menuStrip.SuspendLayout(); SuspendLayout(); // メニュー // menuStrip.Items.Add(menuItemOpen); menuStrip.Name = "menuStrip"; menuStrip.RenderMode = ToolStripRenderMode.System; menuStrip.TabIndex = 0; menuStrip.Text = "menuStrip"; menuItemOpen.Name = "menuItemOpen"; menuItemOpen.Text = "開く(&O)..."; menuItemOpen.Click += new System.EventHandler(Open_Click); menuItemOpen.ShortcutKeys = ((Keys)((Keys.Control | Keys.O))); // フォーム // Controls.Add(menuStrip); MainMenuStrip = menuStrip; MaximizeBox = false; FormBorderStyle = FormBorderStyle.FixedSingle; // レイアウト // menuStrip.ResumeLayout(false); ResumeLayout(false); PerformLayout(); } private MenuStrip menuStrip; private ToolStripMenuItem menuItemOpen; private void Open_Click(object sender, EventArgs e) { Console.WriteLine(SSS.DebugUtil.CallStackLines(0)); } } public override void Test() { Application.Run(new FormTestMenuShortcutKeys()); } } }
コンソールアプリケーションの Main() から、Test() を呼んで実行します。コードのほんどの部分は、単にメニューを作成しているだけです。スタックトレースを出力している SSS.DebugUtil.CallStackLines は、こちらをご覧ください。
このサイトのページへのリンクは自由に行っていただいてかまいません。
このサイトで公開している全ての画像、プログラム、文書の無断転載を禁止します。
ここをクリック
すると表示されるページから作者へメールで連絡できます。