检测按钮是右键单击还是左单击

本文关键字:单击 右键 按钮 检测 | 更新日期: 2023-09-27 18:33:55

我的问题就像我认为的那样简单,但事实证明它有点复杂,我试图实现的是:我的 WinForm 中有几个按钮几乎做同样的事情,所以我创建了一个事件来处理所有这些按钮,现在我希望根据他们单击的鼠标按钮为他们提供一些其他功能, 例如,如果按钮左键单击时一直执行,但如果其右键单击以其他方式执行,则可以实现吗?,任何帮助将不胜感激。

我正在寻找一些这样的声明,也许...

 private void buttons_Click(object sender, EventArgs e)
         {
 if(e.buttons==mousebuttons.right)
 //do something 
 else
 //do other thing
 }

如您所知,这无法实现,因为e没有mouse button events,因为我不被称为button click event

检测按钮是右键单击还是左单击

只需尝试使用button1_MouseDown事件而不是buttons_Click Event.It 就可以解决您的问题。

   private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
          //do something
        }
        if (e.Button == MouseButtons.Right)
        {
          //do something
        }
    }

它似乎不适用于点击事件。但是 MouseDown 事件将为您提供一个具有按钮属性的 MouseEventArgs。所以也许你可以修改你的代码来使用鼠标按下的点击?

var btn = new Button();
btn.Text = "BUTTON";
btn.MouseDown += ((o, e) => {
    MessageBox.Show(e.Button.ToString());
});

为默认为 false 的左右按钮创建一个类布尔变量。当鼠标按下事件触发时,将变量设置为 true,并检查两者是否为真。当鼠标向上触发时,将变量设置为 false。

public bool m_right = false;
public bool m_left = false;
private void MainForm_MouseDown(object sender, MouseEventArgs e)
{
    m_objGraphics.Clear(SystemColors.Control);
    if (e.Button == MouseButtons.Left)
        m_left = true;
    if (e.Button == MouseButtons.Right)
        m_right = true;
    if (m_left == false || m_right == false) return;
    //do something here
}
private void MainForm_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
        m_left = false;
    if (e.Button == MouseButtons.Right)
        m_right = false;
 }

以下代码对我来说效果很好。(请注意,我使用的是类似于问题中的函数的 EventArgs 类型(。

private void buttons_Click(Object sender, EventArgs e({

Type t = e.GetType();
if (t.Equals(typeof(MouseEventArgs)))
{
    MouseEventArgs mouse = (MouseEventArgs)e;
    if (mouse.Button == MouseButtons.Left)
    {
        Console.WriteLine("****Left!!");
    }
    if (mouse.Button == MouseButtons.Right)
    {
        Console.WriteLine("****Right!!");
    }
}

}

目标:处理鼠标左键单击和鼠标右键单击。

问题:单击鼠标右键时不会引发 Click 事件。 仅当按下鼠标左键然后松开时,它才会升起。

溶液:

  1. 订阅 Click, 和 MouseRightButtonUp 事件。

注 A.当鼠标右键在按钮上释放时,将引发 MouseRightButtonUp 事件,而不管最初按下按钮时它是否在按钮上方。

注B.它与此情况无关,但您应该注意,按钮对象的 Click 事件(按下并释放鼠标左键(同时处理 MouseLeftButtonDown 和 MouseLeftButtonUp 事件,因此当您使用鼠标 Left-button 单击 Button 对象时,这两个事件都无法处理。 如果您确实需要单独处理这些操作,则应订阅 PreviewMouseLeftButtonDown 和/或 PreviewMouseLeftButtonUp。

  1. 然后,您可以:

    a. 有 2 个单独的事件处理程序,每个事件一个,或者

    b. 编写一个可以处理 Click 和 MouseRightButtonUp 事件的事件处理程序。注意:Click 事件需要一个接受 RoutedEventArgs 类型的参数的处理程序,而 MouseRightButtonUp 事件需要 MouseButtonEventArgs 类型的参数之一。 RoutedEventArgs 和 MouseButtonEventArgs 都继承自 EventArgs。 因此,使处理程序接受事件参数。 然后,处理程序应确定它是否已传递 RoutedEventArgs(在这种情况下,它执行左键单击所需的操作(或 MouseButtonEventArgs(在这种情况下,它执行右键单击所需的操作(。

代码示例:

myButton.MouseRightButtonUp += MenuItemButton_Click;
myButton.Click += MenuItemButton_Click;
internal void MenuItemButton_Click(object sender, EventArgs e)
{
    var clickedButton = sender as Button;
    string EventArgsType = e.GetType().ToString();
    //Remove leading qualification from Type ("System.Windows." or "System.Windows.Input.")
    EventArgsType = type.Substring(EventArgsType.LastIndexOf('.') + 1);
    switch (EventArgsType)
    {
        //Handle R-Click (RightMouseButtonUp)
        case "MouseButtonEventArgs":
            var MbeArgs = e as MouseButtonEventArgs;
           //Do stuff
            break;
        //Handle L-Click (Click)
        case "RoutedEventArgs":
            var ReArgs = e as RoutedEventArgs;
            //Do stuff
            break;
        default:
            break;
    }
}