C# 钩子函数对鼠标和键盘的监控

/// <summary>
///安装钩子
/// </summary>
/// <param name="idHook"></param>
/// <param name="lpfn"></param>
/// <param name="intPtr"></param>
/// <param name="dwThreadId"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern int SetWindowsHookEx(int idHook, HOOKPROC lpfn, IntPtr intPtr, int dwThreadId);
public delegate int HOOKPROC(int code,int param,IntPtr iparm);
HOOKPROC KeyBoardProc;
/// <summary>
/// 卸载钩子
/// </summary>
/// <param name="idHook"></param>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern int UnhookWindowsHookEx(int idHook);
/// <summary>
/// 传递给下一个钩子,要不然下一个钩子住不到
/// </summary>
/// <returns></returns>
[DllImport("user32.dll")]
public static extern int CallNextHookEx(int idHook,int code,Int32 param,IntPtr iparam);
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);
int mhHook;
/// <summary>
/// anzhuang gouzi
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
KeyBoardProc = new HOOKPROC(keyBordProc);
// mhHook = SetWindowsHookEx(13, KeyBoardProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
mhHook = SetWindowsHookEx(14, KeyBoardProc, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
}
int keyBordProc( int code, int param, IntPtr iparam)
{
KeyBoardHookitStruct kh = (KeyBoardHookitStruct)Marshal.PtrToStructure(iparam, typeof(KeyBoardHookitStruct));
//键盘
if (kh.vkcode == (int)Keys.F3 && param == 256)//256 按下 257 抬起
{
MessageBox.Show("按下F3");
}
if (kh.vkcode == (int)Keys.F4 && param == 256)//256 按下 257 抬起
{
MessageBox.Show("按下F4");
}
//// 鼠标
//// 判断wParam的值来判断是哪个鼠标事件
switch ((int)param)
{
case 513: // WM_LBUTTONDOWN
Debug.Write("Left Mouse Button Down");
// MessageBox.Show("按下左键");
break;
case 514: // WM_LBUTTONUP
Debug.Write("Left Mouse Button Up");
//MessageBox.Show("松下左键");
break;
case 516: // WM_RBUTTONDOWN
Debug.Write("Right Mouse Button Down");
// MessageBox.Show("按下右键");
break;
case 517: // WM_RBUTTONUP
Debug.Write("Right Mouse Button Up");
// MessageBox.Show("松下右键");
break;
// ... 其他事件
}
Debug.Write("code=="+code+"kh.vkcode==" + kh.vkcode + "param=="+ param+ "iparam=="+ iparam+"\r\n");
return CallNextHookEx(mhHook,code,param,iparam);
}
[StructLayout(LayoutKind.Sequential)]
class KeyBoardHookitStruct
{
//键盘
public int vkcode;//1-254 键盘码
//public int time;
//public int dwExtrainfo;
//鼠标
public Point Point;
public uint mouseData;
public uint flags;
//共用
public uint time;
public IntPtr dwExtraInfo;
}
private void button2_Click(object sender, EventArgs e)
{
UnhookWindowsHookEx(mhHook);
}
}
参考文章
https://blog.csdn.net/greston/article/details/8243115

浙公网安备 33010602011771号