![](http://static.javashuo.com/static/loading.gif)
先貼代碼
Codeusing System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MouseHook
{
public partial class Form1 : Form
{
int hHook;//用來保存鉤子句柄。
HookProc hook;//用來存放消息處理函數。
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 該函數用於安裝鉤子。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//所謂安裝鉤子就是調用SetWindowsHookEx方法。
hook=new HookProc(MouseHookProc);
hHook = SetWindowsHookEx(14,hook , IntPtr.Zero, 0); ;
if (hHook > 0) { MessageBox.Show("鉤子安裝成功!"); } else { MessageBox.Show("鉤子安裝失敗!"); }
}
/// <summary>
/// 使用完必須卸載鉤子。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
//所謂卸載鉤子就是調用UnhookWindowsHookEx方法
if (hHook > 0)
{
UnhookWindowsHookEx(hHook);
}
else
{
MessageBox.Show("尚未安裝鉤子!");
}
}
/// <summary>
/// 鉤到消息後用這個函數來處理。
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//鉤到的鼠標消息就存放在地址爲lParam的地方,Marshal.PtrToStructure方法就是用來把相應內存處的數據轉換爲.Net能夠方便處理的數據結構(類)。
var mhs = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
if (nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);//調用鉤子鏈中的下一個鉤子
}
else
{
//開始處理消息
textBox1.Text = string.Format("當前鼠標位置爲:({0},{1})", mhs.Point.X, mhs.Point.Y);
//結束處理消息
return CallNextHookEx(hHook, nCode, wParam, lParam);////調用鉤子鏈中的下一個鉤子
}
}
#region Win32API
#region 系統接口
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);
#endregion
#region 數據結構
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int X;
public int Y;
}
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT Point;
public int hWnd;
public int wHitTestCode;
public int dwExtraInfo;
}
#endregion
#endregion
}
}
使用鼠標鉤子只須要調用SetWindowsHookEx函數便可,該函數是操做系統給咱們的API,經過引用外部函數的形式來引用。該函數須要參數有:一、鉤子的類型(WH_MOUSE_LL=14爲鼠標低級鉤子),二、鉤子的回調函數(即鉤到消息後怎麼處理,該函數的類型用HookProc表示),三、應用程序句柄(這裏設爲0),四、線程句柄(也設爲0)。安裝以後鉤子就應該能夠運行了,貼下結果:this