是否有無論如何檢查菜單項事件是來自菜單中的點擊還是來自按下的快捷鍵?檢查一個菜單項事件是否來自點擊或快捷方式
我已經嘗試添加事件處理程序的按鍵和按鍵事件,但是這些事件不會被「解僱」,當它是一個快捷鍵被按下(他們按預期工作,當它不是一個快捷鍵) 。我無法在發送者對象中找到任何與菜單單擊或快捷方式單擊不同的內容。
是否有無論如何檢查菜單項事件是來自菜單中的點擊還是來自按下的快捷鍵?檢查一個菜單項事件是否來自點擊或快捷方式
我已經嘗試添加事件處理程序的按鍵和按鍵事件,但是這些事件不會被「解僱」,當它是一個快捷鍵被按下(他們按預期工作,當它不是一個快捷鍵) 。我無法在發送者對象中找到任何與菜單單擊或快捷方式單擊不同的內容。
您可以通過覆蓋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
}
謝謝,ProcessCmdKey是我想要的。要注意的是,如果它是菜單單擊或Shotcut鍵,則ToolStripMenuItem_Click事件將被引發。 – GraeningM
那麼要獲得幫助,你應該發佈你已經嘗試過的。 (你的源)
您可以使用一個枚舉此:
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應該提供更多細節,例如張貼一些代碼。
我看到這個問題的單一解決方案 - 覆蓋處理快捷方式時引發的ToolStripMenuItem的ProcessCmdKey方法。在這種情況下,您可以確定點擊是由快捷方式引起的。顯然,你需要使用你自己的ToolstripMenuItem類而不是標準的類。
處理MouseDown事件處理您的鼠標點擊。
menuItem.MouseDown + = new MouseEventHandler(Process_Mouse_Click_Handler);
處理Click事件以處理您的快捷方式。
menuItem.Click + = new EventHandler(Process_Shortcut_Handler);
如果你走這條路(我不主張你這樣做),那麼你應該處理鼠標事件。 – BitsEvolved
只是出於好奇,有什麼點差異點擊快捷鍵? – ken2k
請問爲什麼你需要這樣的功能?通常我會說,鼠標點擊或按鍵不應有任何區別,它是菜單項的一個任務,從中抽象出來。 – Desty
一臺電腦出現問題,它看起來隨機地打開了與F3鍵綁定的應用程序中的表單。我的懷疑是計算機的鍵盤正在發送密鑰。但是,由於有很多方法可以打開表單(菜單點擊,快捷方式,「最近打開」表單的下拉菜單,或者只是關閉頂部表單並返回到頂部表單),問題從未發生過我在身邊我無法驗證問題。所以我想在F3鍵被按下時記錄下來,看看問題出現時是否匹配。 – GraeningM