检查菜单项事件是否来自点击或快捷方式

时间:2013-01-09 15:59:38

标签: c# winforms keyboard-shortcuts menuitem keyevent

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

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

4 个答案:

答案 0 :(得分: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也应该提供更多细节,比如发布一些代码。

答案 1 :(得分: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
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

menuItem.MouseDown + = new MouseEventHandler(Process_Mouse_Click_Handler);

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

menuItem.Click + = new EventHandler(Process_Shortcut_Handler);