当前位置:首页 > C# > 正文内容

c# 全局鼠标事件

admin7年前 (2018-02-05)C#6068

1.Win32Api

  • 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);
  • }

2.MouseHook

  • 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 static int hMouseHook = 0;
  • 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
  • {
  • 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;
  • }
  • 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;
  • }

3.调用

  • MouseHook mh;
  • private void Form1_Load(object sender, EventArgs e)
  • {
  • mh = new MouseHook();
  • mh.SetHook();
  • mh.MouseDownEvent += mh_MouseDownEvent;
  • mh.MouseUpEvent += mh_MouseUpEvent;
  • }
  • bool LeftTag = false;
  • bool RightTag = false;
  • Point p1 = new Point(0,0);
  • Point p2 = new Point(0, 0);
  • //按下鼠标键触发的事件
  • private void mh_MouseDownEvent(object sender, MouseEventArgs e)
  • {
  • if (e.Button == MouseButtons.Left)
  • {
  • LeftTag = true;
  • richTextBox1.AppendText("按下了左键\n");
  • }
  • if (e.Button == MouseButtons.Right)
  • {
  • RightTag = true;
  • richTextBox1.AppendText("按下了右键\n");
  • }
  • p1 = e.Location;
  • }
  • //松开鼠标键触发的事件
  • private void mh_MouseUpEvent(object sender, MouseEventArgs e)
  • {
  • p2 = e.Location;
  • double value = Math.Sqrt(Math.Abs(p1.X - p2.X) * Math.Abs(p1.X - p2.X) + Math.Abs(p1.Y - p2.Y) * Math.Abs(p1.Y - p2.Y));
  • //if (LeftTag && RightTag && value > 100)
  • //{
  • // MessageBox.Show("ok");
  • //}
  • if (e.Button == MouseButtons.Left)
  • {
  • richTextBox1.AppendText("松开了左键\n");
  • }
  • if (e.Button == MouseButtons.Right)
  • {
  • richTextBox1.AppendText("松开了右键\n");
  • }
  • richTextBox1.AppendText("移动了" + value + "距离\n");
  • RightTag = false;
  • LeftTag = false;
  • p1 = new Point(0, 0);
  • p2 = new Point(0, 0);
  • }
  • private void Form1_FormClosed(object sender, FormClosedEventArgs e)
  • {
  • mh.UnHook();
  • }

阅读剩余的71%

扫描二维码推送至手机访问。

版权声明:本文由视觉博客发布,如需转载请注明出处。

本文链接:https://feelsight.cn/post/53.html

“c# 全局鼠标事件” 的相关文章

 C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)

C#图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果)

一、各种旋转、改变大小 注意:先要添加画图相关的using引用。 //向右旋转图像90°代码如下: private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {...

安装包制作工具 SetupFactory使用1 详解

安装包制作工具 SetupFactory使用1 详解

Setup Factory 是一个强大的安装程序制作工具。提供了安装制作向导界面,即使你对安装制作不了解,也可以生成专业性质的安装程序。可建立快捷方式,也可直接在 Windows 系统的注册表加入内容,还能在 Win.ini 和 System.ini 内加入设定值,更可以建立反安装选...

高恪路由器批量管理监控系统

高恪路由器批量管理监控系统

一、采用C# 编写,可以批量监控路由器是否正常 功能: 1.显示当前路由IP、名字、实时上行速度、实时下行速度、主机数量、连接数、CPU占用率、内存占用率、CPU温度、运行时间等 2.可以显示10分钟实时流量 3.可以显示历史2小时、...

c# 委托实现多线程的实例/另一个class类调用控件

c# 委托实现多线程的实例/另一个class类调用控件

一、使用线程在窗体中显示进度条 在Winform应用程序中,经常用进度条显示进度信息。这时候就可能用到多线程。如果不采用多线程控制进度条的话,窗口界面很容易假死(无法看到进度信息,看起来像界面卡住了)。 在这个实例中,我们建立一个窗体,窗体中包括一个后台组件,一个进度条控件。当在主窗...

c#程序闪退日志记录/异常日志

以下代码是程序入口文件 using DDS_Form1; using System; using System.Collections.Generic; using System.IO; //using System.Linq; using System.Windows.Forms;...

C# .net动态加载第三方DLL

C#动态加载第三方DLL 当我们需要加载第三方非托管DLL时,通常会直接使用DllImport的方式,代码如下: [DllImport("GetFile.dll", CallingConvention = CallingConvention.StdCall,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。