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

3
我的问题原本以为很简单,但事实上有些复杂。我想要做的是这样的:在我的WinForm中有几个按钮,它们几乎都做相同的事情,因此我创建了一个事件来处理它们所有的操作。现在,我希望根据鼠标点击的不同,给它们一些其他的功能,例如,如果左键点击按钮,则执行与以前相同的操作,但如果右键点击,则执行另一种操作。这可行吗?非常感谢您的帮助。
我正在寻找类似于以下语句的陈述...
 private void buttons_Click(object sender, EventArgs e)
         {
 if(e.buttons==mousebuttons.right)
 //do something 
 else
 //do other thing
 }

你知道的,问题在于这是无法实现的,因为e没有鼠标按钮事件,因为它被调用作为一个按钮点击事件


1
“点击” 的定义是单击鼠标左键。您的用户也会期望如此。如果在程序中右击按钮会发生某些事情,这可能会令人困惑。也许您可以找到更符合标准的方式来启动操作。毕竟,按钮上只有一个文本,很难用一个文本传达两种点击按钮的含义。 - nvoigt
每当我做类似这样的事情时,我都会使用MouseUp事件,因为点击事件包括MouseDown和MouseUp事件,并且直到鼠标释放才会触发,所以在我的脑海中,这是最合适的地方来执行这样的操作。 - Mark Hall
1
你可以将 EventArgs e 强制转换为 MouseEventArgs。然而,它只能捕获 mousebuttons.left 而不能捕获 mousebuttons.right - Edper
5个回答

8

尝试使用 button1_MouseDown 事件代替 buttons_Click 事件,这将解决您的问题。

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

3

似乎无法使用点击事件。但是,MouseDown事件将为您提供一个具有button属性的MouseEventArgs。因此,也许您可以修改您的代码,改用MouseDown而不是click?

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

2
由于点击事件包含MouseDown和MouseUp,我更倾向于使用MouseUp事件。在我看来。 - Mark Hall

2

创建一个布尔类型的类变量,用于左右按钮,默认值为 false。当鼠标按下事件触发时,将变量设置为 true,并检查两个按钮是否都为 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;
 }

Source


0

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

问题: 当鼠标右键单击时,不会触发单击事件。只有在鼠标左键按下并释放时才会触发。

解决方案:

  1. 订阅单击事件和鼠标右键抬起事件。

注意 A. 当鼠标右键在按钮上释放时,无论最初按下时是否在按钮上,都会触发MouseRightButtonUp事件。

注意 B. 这种情况与本文无关,但您应该知道,Button对象的Click事件(按下并释放鼠标左键)处理MouseLeftButtonDown和MouseLeftButtonUp事件,因此当您使用鼠标左键单击Button对象时,这两个事件都不能被处理。如果您确实需要分别处理这些操作,则应订阅PreviewMouseLeftButtonDown和/或PreviewMouseLeftButtonUp事件。

  • 然后你可以选择:

    a. 为这两个事件分别编写两个不同的事件处理程序,或者

    b. 编写一个事件处理程序,可以同时处理单击和鼠标右键弹起事件。 注意:单击事件需要一个接受类型为RoutedEventArgs的参数的处理程序,而MouseRightButtonUp事件需要一个接受类型为MouseButtonEventArgs的参数的处理程序。RoutedEventArgs和MouseButtonEventArgs都继承自EventArgs。因此,让处理程序接受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;
        }
    }
    

    0
    以下代码对我非常有效。(请注意,我正在使用类似于问题中的函数的EventArgs类型)。
    私有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!!");
        }
    
    }
    

    }


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接