[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = CharSet.Auto,
CallingConvention = CallingConvention.StdCall)]
private static extern int CallNextHookEx(
int idHook,
int nCode,
int wParam,
IntPtr lParam);
//Declare the wrapper managed POINT class.
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
//Declare the wrapper managed MouseHookStruct class.
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
//声明键盘钩子的封送结构类型
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //表示一个在1到254间的虚似键盘码
public int scanCode; //表示硬件扫描码
public int flags;
public int time;
public int dwExtraInfo;
}
private int MouseHookProc(int nCode, int wParam, IntPtr lParam)
{
this.label2.Text = "";
// if ok and someone listens to our events
if ((nCode >= 0))
{
// //Marshall the data from callback.
MouseHookStruct mouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
switch (wParam)
{
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_LBUTTONDBLCLK:
this.label2.Text = "Left : ";
break;
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_RBUTTONDBLCLK:
this.label2.Text = "Right : ";
break;
case WM_MOUSEWHEEL:
this.label2.Text = "Wheel : ";
break;
}
this.label2.Text += mouseHookStruct.pt.x.ToString() + " " + mouseHookStruct.pt.y.ToString();
}
//call next hook
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
private int KeyboardHookProc(int nCode, int wParam, IntPtr lParam)
{
//it was ok and someone listens to events
if ((nCode >= 0))
{
//read structure KeyboardHookStruct at lParam
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
//raise KeyDown
if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
this.textBox1.Text +=" -" + keyData.ToString();
this.textBox1.SelectionStart = this.textBox1.Text.Length;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Reflection;
namespace hookKeyMose
{
/// <summary>
/// Summary description for Form1.
///
/// http://www.cnblogs.com/michaelxu/archive/2006/09/22/511557.aspx
/// http://support.microsoft.com/default.aspx?scid=kb;en-us;318804
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
HookProc MouseHookProcedure;
HookProc KeyboardHookProcedure;
static int hHook = 0;
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
/**//// <summary>
/// Windows NT/2000/XP: Installs a hook procedure that monitors low-level mouse input events.
/// </summary>
private const int WH_MOUSE_LL = 14;
/**//// <summary>
/// Windows NT/2000/XP: Installs a hook procedure that monitors low-level keyboard input events.
/// </summary>
private const int WH_KEYBOARD_LL = 13;
private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_LBUTTONUP = 0x202;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_RBUTTONUP = 0x205;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_MBUTTONDOWN = 0x207;
private const int WM_MBUTTONUP = 0x208;
private const int WM_MBUTTONDBLCLK = 0x209;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBox1;
private const int WM_MOUSEWHEEL = 0x20A;
private const int WM_KEYDOWN = 0x0100;
private const int WM_KEYUP = 0x0101;
private const int WM_SYSKEYDOWN = 0x0104;
private const int WM_SYSKEYUP = 0x0105;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
MouseHookProcedure = new HookProc(this.MouseHookProc);
KeyboardHookProcedure = new HookProc(this.KeyboardHookProc);
//install hook
int hMouseHook = SetWindowsHookEx(
WH_MOUSE_LL,//原来是WH_MOUSE
MouseHookProcedure,
Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]),
0);