0

无论如何要检查菜单项事件是来自菜单中的单击还是来自按下的快捷键?

我已经尝试将事件处理程序添加到按键和按键事件,但是当按下快捷键时,这些事件不会被“触发”(当它不是快捷键时它们会按预期工作)。我在发件人对象中找不到菜单单击或快捷单击之间不同的任何内容。

4

4 回答 4

1

要获得帮助,您应该发布您尝试过的内容。(您的来源)

您可以为此使用枚举:

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 也应该提供更多细节,比如发布一些代码。

于 2013-01-09T16:03:21.073 回答
1

您可以通过覆盖 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
}
于 2013-01-09T16:26:37.670 回答
0

我看到了这个问题的单一解决方案 - 覆盖 ToolStripMenuItem 的 ProcessCmdKey 方法,该方法在处理快捷方式时引发。在这种情况下,您可以确定单击是由快捷方式引起的。显然,您需要使用自己的 ToolstripMenuItem 类而不是标准类。

于 2013-01-09T16:08:30.063 回答
0

处理 MouseDown 事件以处理您的鼠标单击。

menuItem.MouseDown += new MouseEventHandler(Process_Mouse_Click_Handler);

处理 Click 事件以处理您的快捷方式。

menuItem.Click+= new EventHandler(Process_Shortcut_Handler);

于 2014-01-03T19:06:29.143 回答