如何获得右键单击鼠标事件? 将EventArgs更改为MouseEventArgs会导致Form1Designer中出错?

我有一种方法可以通过双击表单来检测visual studio所做的左键单击事件。

private void pictureBox1_Click(object sender, EventArgs e) { MessageBox.Show("Left click"); } 

我希望通过右键单击同一对象来进行右键单击事件。

我在网上看到你可以使用这个开关:

  private void pictureBox1_Click(object sender, EventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right){MessageBox.Show("Right click");} if (e.Button == System.Windows.Forms.MouseButtons.Left){MessageBox.Show("Left click");} } 

麻烦的是,当我这样做时,e.Button有一条红线和错误:

  "'System.EventArgs' does not contain a definition for 'Button'... " 

所以我通过将“EventArgs e”改为“MouseEventArgs e”来解决这个问题。

但是Form1Designer中有一个新错误,其中事件行是:

  this.pictureBox1.Click += new System.EventHandler(this.pictureBox1_Click); 

错误说:

 "No overload for 'pictureBox1_Click' matches delegate 'System.EventHandler' " 

我该如何解决? 谢谢阅读

您应该在click事件处理程序中引入一个强制转换

 MouseEventArgs me = (MouseEventArgs) e; 

你需要MouseClick而不是Click事件处理程序, 引用 。

 switch (e.Button) { case MouseButtons.Left: // Left click break; case MouseButtons.Right: // Right click break; ... } 

对我来说,MouseClick或Click事件都不起作用,因为右键单击时不会调用事件。 快速的方法是:

  private void button1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { //do something here } else//left or middle click { //do something here } } 

您可以修改它以完全根据参数的值进行操作。

警告:只有一个捕获只使用鼠标按下事件。 如果您在控件上进行了mousedown然后将光标移出控件以释放它 ,则仍会触发该事件。 为了避免这种情况,您还应确保在事件处理程序的控件内发生鼠标。 在检查按钮之前检查鼠标光标坐标是否在控件的矩形内,将正确执行。

使用MouseClick事件而不是Click

使用MouseDown事件

 if(e.Button == MouseButton.Right) 

请参阅下面的代码,这是关于获取鼠标事件的完整代码(右键单击,左键单击)您可以自己编写此代码并自行创建。

 using System; using System.Drawing; using System.Windows.Forms; using System.Runtime.InteropServices; namespace Demo_mousehook_csdn { public partial class Form1 : Form { public Form1() { InitializeComponent(); } MouseHook mh; private void Form1_Load(object sender, EventArgs e) { mh = new MouseHook(); mh.SetHook(); mh.MouseMoveEvent += mh_MouseMoveEvent; mh.MouseClickEvent += mh_MouseClickEvent; mh.MouseDownEvent += mh_MouseDownEvent; mh.MouseUpEvent += mh_MouseUpEvent; } private void mh_MouseDownEvent(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { richTextBox1.AppendText("Left Button Press\n"); } if (e.Button == MouseButtons.Right) { richTextBox1.AppendText("Right Button Press\n"); } } private void mh_MouseUpEvent(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { richTextBox1.AppendText("Left Button Release\n"); } if (e.Button == MouseButtons.Right) { richTextBox1.AppendText("Right Button Release\n"); } } private void mh_MouseClickEvent(object sender, MouseEventArgs e) { //MessageBox.Show(eX + "-" + eY); if (e.Button == MouseButtons.Left) { string sText = "(" + eXToString() + "," + eYToString() + ")"; label1.Text = sText; } } private void mh_MouseMoveEvent(object sender, MouseEventArgs e) { int x = e.Location.X; int y = e.Location.Y; textBox1.Text = x + ""; textBox2.Text = y + ""; } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { mh.UnHook(); } private void Form1_FormClosed_1(object sender, FormClosedEventArgs e) { mh.UnHook(); } private void richTextBox1_TextChanged(object sender, EventArgs e) { } } public class Win32Api { [StructLayout(LayoutKind.Sequential)] public class POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] public class MouseHookStruct { public POINT pt; public int hwnd; public int wHitTestCode; public int dwExtraInfo; } public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); } public class MouseHook { private Point point; private Point Point { get { return point; } set { if (point != value) { point = value; if (MouseMoveEvent != null) { var e = new MouseEventArgs(MouseButtons.None, 0, point.X, point.Y, 0); MouseMoveEvent(this, e); } } } } private int hHook; private const int WM_MOUSEMOVE = 0x200; private const int WM_LBUTTONDOWN = 0x201; private const int WM_RBUTTONDOWN = 0x204; private const int WM_MBUTTONDOWN = 0x207; private const int WM_LBUTTONUP = 0x202; private const int WM_RBUTTONUP = 0x205; private const int WM_MBUTTONUP = 0x208; private const int WM_LBUTTONDBLCLK = 0x203; private const int WM_RBUTTONDBLCLK = 0x206; private const int WM_MBUTTONDBLCLK = 0x209; public const int WH_MOUSE_LL = 14; public Win32Api.HookProc hProc; public MouseHook() { this.Point = new Point(); } public int SetHook() { hProc = new Win32Api.HookProc(MouseHookProc); hHook = Win32Api.SetWindowsHookEx(WH_MOUSE_LL, hProc, IntPtr.Zero, 0); return hHook; } public void UnHook() { Win32Api.UnhookWindowsHookEx(hHook); } private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { Win32Api.MouseHookStruct MyMouseHookStruct = (Win32Api.MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(Win32Api.MouseHookStruct)); if (nCode < 0) { return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam); } else { if (MouseClickEvent != null) { MouseButtons button = MouseButtons.None; int clickCount = 0; switch ((Int32)wParam) { case WM_LBUTTONDOWN: button = MouseButtons.Left; clickCount = 1; MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0)); break; case WM_RBUTTONDOWN: button = MouseButtons.Right; clickCount = 1; MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0)); break; case WM_MBUTTONDOWN: button = MouseButtons.Middle; clickCount = 1; MouseDownEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0)); break; case WM_LBUTTONUP: button = MouseButtons.Left; clickCount = 1; MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0)); break; case WM_RBUTTONUP: button = MouseButtons.Right; clickCount = 1; MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0)); break; case WM_MBUTTONUP: button = MouseButtons.Middle; clickCount = 1; MouseUpEvent(this, new MouseEventArgs(button, clickCount, point.X, point.Y, 0)); break; } var e = new MouseEventArgs(button, clickCount, point.X, point.Y, 0); MouseClickEvent(this, e); } this.Point = new Point(MyMouseHookStruct.pt.x, MyMouseHookStruct.pt.y); return Win32Api.CallNextHookEx(hHook, nCode, wParam, lParam); } } public delegate void MouseMoveHandler(object sender, MouseEventArgs e); public event MouseMoveHandler MouseMoveEvent; public delegate void MouseClickHandler(object sender, MouseEventArgs e); public event MouseClickHandler MouseClickEvent; public delegate void MouseDownHandler(object sender, MouseEventArgs e); public event MouseDownHandler MouseDownEvent; public delegate void MouseUpHandler(object sender, MouseEventArgs e); public event MouseUpHandler MouseUpEvent; } } 

您可以在此处下载演示和教程: C#Mouse Hook Demo

这肯定会帮助很多人!

 private void axWindowsMediaPlayer1_ClickEvent(object sender, AxWMPLib._WMPOCXEvents_ClickEvent e) { if(e.nButton==2) { contextMenuStrip1.Show(MousePosition); } } 

[ e.nbutton == 2 ] 就像 [ e.button == MouseButtons.Right ]