检测按钮是右键单击还是左单击
本文关键字:单击 右键 按钮 检测 | 更新日期: 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 事件。 仅当按下鼠标左键然后松开时,它才会升起。
溶液:
- 订阅 Click, 和 MouseRightButtonUp 事件。
注 A.当鼠标右键在按钮上释放时,将引发 MouseRightButtonUp 事件,而不管最初按下按钮时它是否在按钮上方。
注B.它与此情况无关,但您应该注意,按钮对象的 Click 事件(按下并释放鼠标左键(同时处理 MouseLeftButtonDown 和 MouseLeftButtonUp 事件,因此当您使用鼠标 Left-button 单击 Button 对象时,这两个事件都无法处理。 如果您确实需要单独处理这些操作,则应订阅 PreviewMouseLeftButtonDown 和/或 PreviewMouseLeftButtonUp。
-
然后,您可以:
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;
}
}