c# winform监听鼠标按下的事件,使用钩子
【代码】c# winform监听鼠标按下的事件,使用钩子。
·
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Forms;
using static SmartMouse.KeyboardHook;
namespace SmartMouse
{
class MouseListen
{
/// <summary>
/// 鼠标结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt; // 鼠标位置
public int hWnd;
public int wHitTestCode;
public int dwExtraInfo;
}
/// <summary>
/// 鼠标位置结构
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
//定义为鼠标钩子
public int WH_MOUSE_LL = 14;
//相关鼠标事件
public event MouseEventHandler MouseDown;
public event MouseEventHandler MouseUp;
//相关动作
public const int WM_MOUSEMOVE = 0x200; // 鼠标移动
public const int WM_LBUTTONDOWN = 0x201;// 鼠标左键按下
public const int WM_RBUTTONDOWN = 0x204;// 鼠标右键按下
public const int WM_MBUTTONDOWN = 0x207;// 鼠标中键按下
public const int WM_LBUTTONUP = 0x202;// 鼠标左键抬起
public const int WM_RBUTTONUP = 0x205;// 鼠标右键抬起
public const int WM_MBUTTONUP = 0x208;// 鼠标中键抬起
//hookid
private int hookID = 0;
HookProc hookProc1;
/// <summary>
/// 安装钩子
/// </summary>
public void StartHook( )
{
if (hookID == 0)
{
hookProc1 = new HookProc(MouseHookProc);
hookID = SetWindowsHookEx(WH_MOUSE_LL, hookProc1, GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);
if (hookID == 0)
{
StopHook();
throw new Exception("安装键盘钩子失败");
}
}
}
public void StopHook()
{
bool isStop = true;
if (hookID != 0)
{
isStop = UnhookWindowsHookEx(hookID);
hookID = 0;
}
if (!isStop) throw new Exception("卸载键盘钩子失败!");
}
MouseHookStruct hookStruct;
MouseEventArgs e = null;
private int MouseHookProc(int nCode, int wParam, IntPtr lParam)
{
if ((nCode >= 0))
{
hookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
switch (wParam)
{
case WM_LBUTTONDOWN:
e = new MouseEventArgs(MouseButtons.Left, 1, hookStruct.pt.x, hookStruct.pt.y, 0);
MouseDown(this, e);
break;
case WM_RBUTTONDOWN:
e = new MouseEventArgs(MouseButtons.Right, 1, hookStruct.pt.x, hookStruct.pt.y, 0);
MouseDown(this, e);
break;
case WM_LBUTTONUP:
e = new MouseEventArgs(MouseButtons.Left, 1, hookStruct.pt.x, hookStruct.pt.y, 0);
MouseUp(this, e);
break;
case WM_RBUTTONUP:
e = new MouseEventArgs(MouseButtons.Right, 1, hookStruct.pt.x, hookStruct.pt.y, 0);
MouseUp(this, e);
break;
default:
break;
}
}
return CallNextHookEx(hookID, nCode, wParam, lParam);
}
/// <summary>
/// 继续下一个钩子
/// </summary>
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
}
}
MouseListen mouseListen;
private void Form1_Load(object sender, EventArgs e)
{
mouseListen = new MouseListen();
mouseListen.MouseDown += new MouseEventHandler(MouseDown1);
mouseListen.MouseUp += new MouseEventHandler(MouseUp1);
mouseListen.StartHook();
}
private void MouseDown1(object sender, MouseEventArgs e)
{
richTextBox1.AppendText(string.Format("在{0},{1}位置按下了鼠标{2}键", e.X, e.Y, e.Button.ToString()) + "\r\n");
}
private void MouseUp1(object sender, MouseEventArgs e)
{
richTextBox1.AppendText(string.Format("在{0},{1}位置松开了鼠标{2}键", e.X, e.Y, e.Button.ToString()) + "\r\n");
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)