2015-12-08 2 views
2

Я нахожусь на vb.net 2010. В моем приложении winforms у меня есть обработчик события clickItem, который может быть вызван щелчком мыши или сочетаниями клавиш. Как я говорю в моем обработчике был вызван из мыши против ярлыка клавиатуры ключаидентифицировать щелчок мыши и сочетание клавиш по элементу меню

Private Sub myToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles myMenuItemClick 
    Dim MouseClicked As Boolean 
    MouseClicked = ?? how to make the distinction how handler was called ?? 
    If MouseClicked Then 
     lblClicked.Text = "Mouse Click" 
    Else 
     lblClicked.Text = "Key board shortcut" 
    End If 
End Sub 
+0

@Plutonix: Я хочу, чтобы какое-то действие выполнялось, только если оно было вызвано с помощью сочетания клавиш. Как бы вы сделали различие, можете ли вы указать больше с событием меню – glant

+0

, если вы хотите, чтобы произошли разные вещи, вы должны использовать 2 метода, один из которых может вызвать другое (менее запутанное для пользователя). Вы можете * установить флаг в событии dropdownopening, которое будет установлено при нажатии. но они также могут использовать клавишу Alt, чтобы открыть меню и стрелку для выбора или открыть меню верхнего уровня с помощью клавиши короткого вырезания, которая откроет меню и установит флаг. – Plutonix

+0

Будучи пользователем приложения, я был бы очень растерян и раздражен при разных способах сочетания клавиш и щелчка мышью. Как насчет сенсорных экранов? Имеют ли они и другое поведение? –

ответ

1

Вы можете обрабатывать ProcessCmdKey формы и проверьте ярлык, и если ярлык был нажат, возвращает истину. Таким образом, клик будет подкрепляться кликом не по ярлыку:

Private Sub NewToolStripMenuItem_Click(sender As Object, e As EventArgs) _ 
    Handles NewToolStripMenuItem.Click 

    MessageBox.Show("Click") 
End Sub 

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) _ 
    As Boolean 

    If (Me.NewToolStripMenuItem.ShortcutKeys = keyData) Then 
     MessageBox.Show("ShortCut") 
     Return True 
    End If 
    Return MyBase.ProcessCmdKey(msg, keyData) 
End Function 
+0

Работает вообще, но есть действия пользователя, которые могут сломать это, например MouseDown на кнопке, а затем переместить мышь до MouseUp, а затем использовать комбинацию клавиш. Вы можете исправить это, установив mouseDown = false в обработчик MouseLeave кнопки. –

+0

@TonyHinkle Вы правы, но это не могло исправить. Потому что вы можете упасть, затем уйти (все еще вниз), затем войти, а затем вверх. –

+0

@TonyHinkle Я отредактировал ответ, надеюсь, что вы сочтете это полезным :) –