【转】C# 鼠标钩子控制鼠标移动与点击
时间: 2023-08-04 10:02:44 浏览: 50
很抱歉,作为AI语言模型,我没有能力进行代码演示。但是,我可以告诉你一些关于C#鼠标钩子的基本知识。
C#中可以使用System.Windows.Forms命名空间下的MouseHook类来实现鼠标钩子。使用鼠标钩子可以监视并拦截鼠标消息,从而实现对鼠标的控制。
以下是一个简单的示例代码,可以使用鼠标钩子控制鼠标移动和点击:
```
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace MouseHookDemo
{
public partial class Form1 : Form
{
private const int WH_MOUSE_LL = 14;
private const int WM_LBUTTONDOWN = 0x0201;
private const int WM_LBUTTONUP = 0x0202;
private static IntPtr hookId = IntPtr.Zero;
private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
private static HookProc hookCallback = HookCallback;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
private struct POINT
{
public int X;
public int Y;
}
[StructLayout(LayoutKind.Sequential)]
private struct MSLLHOOKSTRUCT
{
public POINT pt;
public uint mouseData;
public uint flags;
public uint time;
public IntPtr dwExtraInfo;
}
public Form1()
{
InitializeComponent();
hookId = SetHook(hookCallback);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnhookWindowsHookEx(hookId);
}
private static IntPtr SetHook(HookProc hookProc)
{
using (ProcessModule module = Process.GetCurrentProcess().MainModule)
{
return SetWindowsHookEx(WH_MOUSE_LL, hookProc, GetModuleHandle(module.ModuleName), 0);
}
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_LBUTTONDOWN)
{
// 鼠标左键按下时
int x = Cursor.Position.X + 10;
int y = Cursor.Position.Y + 10;
Cursor.Position = new Point(x, y);
}
else if (nCode >= 0 && wParam == (IntPtr)WM_LBUTTONUP)
{
// 鼠标左键抬起时
int x = Cursor.Position.X - 10;
int y = Cursor.Position.Y - 10;
Cursor.Position = new Point(x, y);
}
return CallNextHookEx(hookId, nCode, wParam, lParam);
}
private static IntPtr GetModuleHandle(string lpModuleName)
{
IntPtr hModule = IntPtr.Zero;
ProcessModuleCollection modules = Process.GetCurrentProcess().Modules;
foreach (ProcessModule module in modules)
{
if (module.ModuleName == lpModuleName)
{
hModule = module.BaseAddress;
break;
}
}
return hModule;
}
}
}
```
在这个示例代码中,我们使用了鼠标左键按下和抬起的事件来控制鼠标移动。当鼠标左键按下时,鼠标会向右下方移动10个像素,当鼠标左键抬起时,鼠标会向左上方移动10个像素。
需要注意的是,使用鼠标钩子需要在应用程序关闭时释放钩子,否则可能会导致系统崩溃。在这个示例代码中,我们在窗体关闭事件中释放了钩子。
希望这些信息能对你有所帮助!