メニュー項目のイベントがメニューのクリックによるものなのか、ショートカットキーの押下によるものなのかを確認する方法はありますか?
キープレスイベントとキーダウンイベントにイベントハンドラーを追加しようとしましたが、これらのイベントは、ショートカットキーが押されたときに「発生」しません(ショートカットキーでない場合は期待どおりに機能します)。メニュークリックとショートカットクリックで異なる送信者オブジェクトには何も見つかりませんでした。
メニュー項目のイベントがメニューのクリックによるものなのか、ショートカットキーの押下によるものなのかを確認する方法はありますか?
キープレスイベントとキーダウンイベントにイベントハンドラーを追加しようとしましたが、これらのイベントは、ショートカットキーが押されたときに「発生」しません(ショートカットキーでない場合は期待どおりに機能します)。メニュークリックとショートカットクリックで異なる送信者オブジェクトには何も見つかりませんでした。
助けを得るには、試したことを投稿する必要があります。(あなたの情報源)
これには列挙型を使用できます。
enum Sender
{
Shortcut,
Menu
}
void MenuEvent(Sender sender)
{
if (sender == Sender.Shortcut)
{
}
else
{
}
}
//if you click from the menu
void btnMenuClick()
{
MenuEvent(Sender.Menu);
}
//if you use shortcut
void OnShortcutEvent()
{
MenuEvent(Sender.Shortcut);
}
編集:私の答えは漠然としたものだったと思うので、コードを編集しました。今はもっと明確になることを願っていますが、OPはコードの投稿など、より詳細な情報も提供する必要があると言わなければなりません。
ProcessCmdKey をオーバーライドすることで、すべてのキーの組み合わせをキャッチできます。
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.F))
{
Console.WriteLine("My code ran from shortcut");
myFunction();
}
return base.ProcessCmdKey(ref msg, keyData);
}
private void ToolStripMenuItem_click(object sender ...)
{
Console.WriteLine("My code ran from menu item");
myFunction();
}
void myFunction()
{
//your functionality here
}
この問題に対する単一の解決策があります-ショートカットが処理されるときに発生するToolStripMenuItemのProcessCmdKeyメソッドをオーバーライドします。この場合、ショートカットが原因でクリックが発生した時期を特定できます。明らかに、標準のクラスではなく、ToolstripMenuItemの独自のクラスを使用する必要があります。
MouseDown イベントを処理して、マウス クリックを処理します。
menuItem.MouseDown += new MouseEventHandler(Process_Mouse_Click_Handler);
Click イベントを処理して、ショートカットを処理します。
menuItem.Click+= new EventHandler(Process_Shortcut_Handler);