Проверьте, если событие пункта меню происходит от щелчка или ярлыка

Есть ли способ проверить, происходит ли событие пункта меню от щелчка в меню или от нажатия клавиши быстрого доступа?

Я пытался добавить обработчики событий к событиям нажатия и нажатия клавиш, однако эти события не «запускаются», когда нажимается горячая клавиша (они работают должным образом, когда это не горячая клавиша). Я не смог найти в объекте отправителя ничего, что отличалось бы от щелчка меню или щелчка ярлыка.


person GraeningM    schedule 09.01.2013    source источник
comment
Просто из любопытства, какой смысл отличать щелчок от сочетания клавиш?   -  person ken2k    schedule 09.01.2013
comment
Можно поинтересоваться, зачем вам такой функционал? Обычно я бы сказал, что не должно быть никакой разницы между щелчком мыши или нажатием клавиши, это одна задача пункта меню, чтобы абстрагироваться от этого.   -  person Desty    schedule 09.01.2013
comment
У одного компьютера возникла проблема, когда он, по-видимому, случайно открывает форму в приложении, привязанном к клавише F3. Я подозреваю, что клавиатура компьютера отправляет ключ. Однако, поскольку существует несколько способов открыть форму (щелчок меню, ярлык, раскрывающийся список недавно открытых форм или просто закрытие формы сверху и возврат к ней), проблема никогда не возникала, когда я м вокруг, я не могу проверить проблему. Поэтому я хотел зарегистрировать, когда была нажата клавиша F3, и посмотреть, совпадает ли она с появлением проблемы.   -  person GraeningM    schedule 10.01.2013


Ответы (4)


Вы можете поймать все комбинации клавиш, переопределив 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
}
person VladL    schedule 09.01.2013
comment
Спасибо, ProcessCmdKey — это то, что я хотел. Просто отметим, что если это щелчок меню или горячая клавиша, событие ToolStripMenuItem_Click будет вызвано. - person GraeningM; 10.01.2013

Что ж, чтобы получить помощь, вы должны опубликовать то, что вы пробовали. (Ваш источник)

Вы можете использовать перечисление для этого:

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);
}

Изменить: я думаю, мой ответ был расплывчатым, поэтому я отредактировал код. Я надеюсь, что теперь это более понятно, но я должен сказать, что ОП также должен предоставить более подробную информацию, например, опубликовать некоторый код.

person joell    schedule 09.01.2013
comment
сказать вам правду, я не понимаю вашего решения - person platon; 09.01.2013
comment
@platon Прости, надеюсь, теперь все ясно, дай мне знать! Но ОП также мог бы быть немного более ясным. - person joell; 09.01.2013
comment
Я не уверен, какой код вы хотите, что я использую для создания меню? Я могу добавить его, но это значительно сложнее, чем нужно, поскольку оно создает меню на основе информации, хранящейся в базе данных, чтобы мы могли контролировать, кто получает какие пункты меню. Ядро довольно простое, просто пункт меню с ярлыком и событием при щелчке пункта меню. - person GraeningM; 10.01.2013
comment
@GraeningM Вы могли бы опубликовать код, который запускает событие? По крайней мере, для ярлыка можно было бы адаптировать это решение, и если это не то, вы можете предположить, что оно было из меню. - person joell; 10.01.2013

Я вижу единственное решение этой проблемы - переопределить метод ProcessCmdKey ToolStripMenuItem, который вызывается при обработке ярлыка. В этом случае вы можете определить, когда щелчок был вызван ярлыком. Очевидно, вам нужно использовать свой собственный класс ToolstripMenuItem вместо стандартного.

person platon    schedule 09.01.2013

Обработайте событие MouseDown, чтобы обработать щелчок мышью.

menuItem.MouseDown += новый MouseEventHandler (Process_Mouse_Click_Handler);

Обработайте событие Click, чтобы обработать ярлык.

menuItem.Click+= новый обработчик событий (Process_Shortcut_Handler);

person user3158426    schedule 03.01.2014
comment
Если вы пойдете по этому пути (и я не защищаю вас), тогда вам следует вместо этого обрабатывать событие мыши. - person BitsEvolved; 09.06.2017