C#钩子类 几乎捕获键盘鼠标所有事件

来源贴:https://blog.csdn.net/smartsmile2012/article/details/25191249

如果遇到注册钩子返回IntPtr.Zero,请参照一下配置:

1). 在 Visual Studio 中打开项目。
2). 在“项目”菜单上单击“属性”。
3). 单击“调试”选项卡。
4). 清除“启用 Visual Studio 宿主进程”复选框。

将宿主进程复选框去掉后就能正常使用了,希望能有所帮助。

  1 using System;
  2 using System.Text;
  3 using System.Runtime.InteropServices;
  4 using System.Reflection;
  5 using System.Windows.Forms;
  6  
  7 namespace MouseKeyboardLibrary
  8 {
  9  
 10     /// <summary>
 11     /// Abstract base class for Mouse and Keyboard hooks
 12     /// </summary>
 13     public abstract class GlobalHook
 14     {
 15  
 16         #region Windows API Code
 17  
 18         [StructLayout(LayoutKind.Sequential)]
 19         protected class POINT
 20         {
 21             public int x;
 22             public int y;
 23         }
 24  
 25         [StructLayout(LayoutKind.Sequential)]
 26         protected class MouseHookStruct
 27         {
 28             public POINT pt;
 29             public int hwnd;
 30             public int wHitTestCode;
 31             public int dwExtraInfo;
 32         }
 33  
 34         [StructLayout(LayoutKind.Sequential)]
 35         protected class MouseLLHookStruct
 36         {
 37             public POINT pt;
 38             public int mouseData;
 39             public int flags;
 40             public int time;
 41             public int dwExtraInfo;
 42         }
 43  
 44         [StructLayout(LayoutKind.Sequential)]
 45         protected class KeyboardHookStruct
 46         {
 47             public int vkCode;
 48             public int scanCode;
 49             public int flags;
 50             public int time;
 51             public int dwExtraInfo;
 52         }
 53  
 54         [DllImport("user32.dll", CharSet = CharSet.Auto,
 55            CallingConvention = CallingConvention.StdCall, SetLastError = true)]
 56         protected static extern int SetWindowsHookEx(
 57             int idHook,
 58             HookProc lpfn,
 59             IntPtr hMod,
 60             int dwThreadId);
 61  
 62         [DllImport("user32.dll", CharSet = CharSet.Auto,
 63             CallingConvention = CallingConvention.StdCall, SetLastError = true)]
 64         protected static extern int UnhookWindowsHookEx(int idHook);
 65  
 66  
 67         [DllImport("user32.dll", CharSet = CharSet.Auto,
 68              CallingConvention = CallingConvention.StdCall)]
 69         protected static extern int CallNextHookEx(
 70             int idHook,
 71             int nCode,
 72             int wParam,
 73             IntPtr lParam);
 74  
 75         [DllImport("user32")]
 76         protected static extern int ToAscii(
 77             int uVirtKey,
 78             int uScanCode,
 79             byte[] lpbKeyState,
 80             byte[] lpwTransKey,
 81             int fuState);
 82  
 83         [DllImport("user32")]
 84         protected static extern int GetKeyboardState(byte[] pbKeyState);
 85  
 86         [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
 87         protected static extern short GetKeyState(int vKey);
 88  
 89         protected delegate int HookProc(int nCode, int wParam, IntPtr lParam);
 90  
 91         protected const int WH_MOUSE_LL = 14;
 92         protected const int WH_KEYBOARD_LL = 13;
 93  
 94         protected const int WH_MOUSE = 7;
 95         protected const int WH_KEYBOARD = 2;
 96         protected const int WM_MOUSEMOVE = 0x200;
 97         protected const int WM_LBUTTONDOWN = 0x201;
 98         protected const int WM_RBUTTONDOWN = 0x204;
 99         protected const int WM_MBUTTONDOWN = 0x207;
100         protected const int WM_LBUTTONUP = 0x202;
101         protected const int WM_RBUTTONUP = 0x205;
102         protected const int WM_MBUTTONUP = 0x208;
103         protected const int WM_LBUTTONDBLCLK = 0x203;
104         protected const int WM_RBUTTONDBLCLK = 0x206;
105         protected const int WM_MBUTTONDBLCLK = 0x209;
106         protected const int WM_MOUSEWHEEL = 0x020A;
107         protected const int WM_KEYDOWN = 0x100;
108         protected const int WM_KEYUP = 0x101;
109         protected const int WM_SYSKEYDOWN = 0x104;
110         protected const int WM_SYSKEYUP = 0x105;
111  
112         protected const byte VK_SHIFT = 0x10;
113         protected const byte VK_CAPITAL = 0x14;
114         protected const byte VK_NUMLOCK = 0x90;
115  
116         protected const byte VK_LSHIFT = 0xA0;
117         protected const byte VK_RSHIFT = 0xA1;
118         protected const byte VK_LCONTROL = 0xA2;
119         protected const byte VK_RCONTROL = 0x3;
120         protected const byte VK_LALT = 0xA4;
121         protected const byte VK_RALT = 0xA5;
122  
123         protected const byte LLKHF_ALTDOWN = 0x20;
124  
125         #endregion
126  
127         #region Private Variables
128  
129         protected int _hookType;
130         protected int _handleToHook;
131         protected bool _isStarted;
132         protected HookProc _hookCallback;
133  
134         #endregion
135  
136         #region Properties
137  
138         public bool IsStarted
139         {
140             get
141             {
142                 return _isStarted;
143             }
144         }
145  
146         #endregion
147  
148         #region Constructor
149  
150         public GlobalHook()
151         {
152  
153             Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
154  
155         }
156  
157         #endregion
158  
159         #region Methods
160  
161         public void Start()
162         {
163  
164             if (!_isStarted &&
165                 _hookType != 0)
166             {
167  
168                 // Make sure we keep a reference to this delegate!
169                 // If not, GC randomly collects it, and a NullReference exception is thrown
170                 _hookCallback = new HookProc(HookCallbackProcedure);
171  
172                 _handleToHook = SetWindowsHookEx(
173                     _hookType,
174                     _hookCallback,
175                     Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
176                     0);
177  
178                 // Were we able to sucessfully start hook?
179                 if (_handleToHook != 0)
180                 {
181                     _isStarted = true;
182                 }
183  
184             }
185  
186         }
187  
188         public void Stop()
189         {
190  
191             if (_isStarted)
192             {
193  
194                 UnhookWindowsHookEx(_handleToHook);
195  
196                 _isStarted = false;
197  
198             }
199  
200         }
201  
202         protected virtual int HookCallbackProcedure(int nCode, Int32 wParam, IntPtr lParam)
203         {
204            
205             // This method must be overriden by each extending hook
206             return 0;
207  
208         }
209  
210         protected void Application_ApplicationExit(object sender, EventArgs e)
211         {
212  
213             if (_isStarted)
214             {
215                 Stop();
216             }
217  
218         }
219  
220         #endregion
221  
222     }
223  
224 }
  1 using System;
  2 using System.Text;
  3 using System.Windows.Forms;
  4 using System.Runtime.InteropServices;
  5  
  6 namespace MouseKeyboardLibrary
  7 {
  8  
  9     /// <summary>
 10     /// Captures global keyboard events
 11     /// </summary>
 12     public class KeyboardHook : GlobalHook
 13     {
 14  
 15         #region Events
 16  
 17         public event KeyEventHandler KeyDown;
 18         public event KeyEventHandler KeyUp;
 19         public event KeyPressEventHandler KeyPress;
 20  
 21         #endregion
 22  
 23         #region Constructor
 24  
 25         public KeyboardHook()
 26         {
 27  
 28             _hookType = WH_KEYBOARD_LL;
 29  
 30         }
 31  
 32         #endregion
 33  
 34         #region Methods
 35  
 36         protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)
 37         {
 38  
 39             bool handled = false;
 40  
 41             if (nCode > -1 && (KeyDown != null || KeyUp != null || KeyPress != null))
 42             {
 43  
 44                 KeyboardHookStruct keyboardHookStruct =
 45                     (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
 46  
 47                 // Is Control being held down?
 48                 bool control = ((GetKeyState(VK_LCONTROL) & 0x80) != 0) ||
 49                                ((GetKeyState(VK_RCONTROL) & 0x80) != 0);
 50  
 51                 // Is Shift being held down?
 52                 bool shift = ((GetKeyState(VK_LSHIFT) & 0x80) != 0) ||
 53                              ((GetKeyState(VK_RSHIFT) & 0x80) != 0);
 54  
 55                 // Is Alt being held down?
 56                 bool alt = ((GetKeyState(VK_LALT) & 0x80) != 0) ||
 57                            ((GetKeyState(VK_RALT) & 0x80) != 0);
 58  
 59                 // Is CapsLock on?
 60                 bool capslock = (GetKeyState(VK_CAPITAL) != 0);
 61  
 62                 // Create event using keycode and control/shift/alt values found above
 63                 KeyEventArgs e = new KeyEventArgs(
 64                     (Keys)(
 65                         keyboardHookStruct.vkCode |
 66                         (control ? (int)Keys.Control : 0) |
 67                         (shift ? (int)Keys.Shift : 0) |
 68                         (alt ? (int)Keys.Alt : 0)
 69                         ));
 70  
 71                 // Handle KeyDown and KeyUp events
 72                 switch (wParam)
 73                 {
 74  
 75                     case WM_KEYDOWN:
 76                     case WM_SYSKEYDOWN:
 77                         if (KeyDown != null)
 78                         {
 79                             KeyDown(this, e);
 80                             handled = handled || e.Handled;
 81                         }
 82                         break;
 83                     case WM_KEYUP:
 84                     case WM_SYSKEYUP:
 85                         if (KeyUp != null)
 86                         {
 87                             KeyUp(this, e);
 88                             handled = handled || e.Handled;
 89                         }
 90                         break;
 91  
 92                 }
 93  
 94                 // Handle KeyPress event
 95                 if (wParam == WM_KEYDOWN &&
 96                    !handled &&
 97                    !e.SuppressKeyPress &&
 98                     KeyPress != null)
 99                 {
100  
101                     byte[] keyState = new byte[256];
102                     byte[] inBuffer = new byte[2];
103                     GetKeyboardState(keyState);
104  
105                     if (ToAscii(keyboardHookStruct.vkCode,
106                               keyboardHookStruct.scanCode,
107                               keyState,
108                               inBuffer,
109                               keyboardHookStruct.flags) == 1)
110                     {
111  
112                         char key = (char)inBuffer[0];
113                         if ((capslock ^ shift) && Char.IsLetter(key))
114                             key = Char.ToUpper(key);
115                         KeyPressEventArgs e2 = new KeyPressEventArgs(key);
116                         KeyPress(this, e2);
117                         handled = handled || e.Handled;
118  
119                     }
120  
121                 }
122  
123             }
124  
125             if (handled)
126             {
127                 return 1;
128             }
129             else
130             {
131                 return CallNextHookEx(_handleToHook, nCode, wParam, lParam);
132             }
133  
134         }
135  
136         #endregion
137  
138     }
139  
140 }
  1 using System;
  2 using System.Text;
  3 using System.Runtime.InteropServices;
  4 using System.Windows.Forms;
  5  
  6 namespace MouseKeyboardLibrary
  7 {
  8  
  9     /// <summary>
 10     /// Standard Keyboard Shortcuts used by most applications
 11     /// </summary>
 12     public enum StandardShortcut
 13     {
 14         Copy,
 15         Cut,
 16         Paste,
 17         SelectAll,
 18         Save,
 19         Open,
 20         New,
 21         Close,
 22         Print
 23     }
 24  
 25     /// <summary>
 26     /// Simulate keyboard key presses
 27     /// </summary>
 28     public static class KeyboardSimulator
 29     {
 30  
 31         #region Windows API Code
 32  
 33         const int KEYEVENTF_EXTENDEDKEY = 0x1;
 34         const int KEYEVENTF_KEYUP = 0x2;
 35  
 36         [DllImport("user32.dll")]
 37         static extern void keybd_event(byte key, byte scan, int flags, int extraInfo); 
 38  
 39         #endregion
 40  
 41         #region Methods
 42  
 43         public static void KeyDown(Keys key)
 44         {
 45             keybd_event(ParseKey(key), 0, 0, 0);
 46         }
 47  
 48         public static void KeyUp(Keys key)
 49         {
 50             keybd_event(ParseKey(key), 0, KEYEVENTF_KEYUP, 0);
 51         }
 52  
 53         public static void KeyPress(Keys key)
 54         {
 55             KeyDown(key);
 56             KeyUp(key);
 57         }
 58  
 59         public static void SimulateStandardShortcut(StandardShortcut shortcut)
 60         {
 61             switch (shortcut)
 62             {
 63                 case StandardShortcut.Copy:
 64                     KeyDown(Keys.Control);
 65                     KeyPress(Keys.C);
 66                     KeyUp(Keys.Control);
 67                     break;
 68                 case StandardShortcut.Cut:
 69                     KeyDown(Keys.Control);
 70                     KeyPress(Keys.X);
 71                     KeyUp(Keys.Control);
 72                     break;
 73                 case StandardShortcut.Paste:
 74                     KeyDown(Keys.Control);
 75                     KeyPress(Keys.V);
 76                     KeyUp(Keys.Control);
 77                     break;
 78                 case StandardShortcut.SelectAll:
 79                     KeyDown(Keys.Control);
 80                     KeyPress(Keys.A);
 81                     KeyUp(Keys.Control);
 82                     break;
 83                 case StandardShortcut.Save:
 84                     KeyDown(Keys.Control);
 85                     KeyPress(Keys.S);
 86                     KeyUp(Keys.Control);
 87                     break;
 88                 case StandardShortcut.Open:
 89                     KeyDown(Keys.Control);
 90                     KeyPress(Keys.O);
 91                     KeyUp(Keys.Control);
 92                     break;
 93                 case StandardShortcut.New:
 94                     KeyDown(Keys.Control);
 95                     KeyPress(Keys.N);
 96                     KeyUp(Keys.Control);
 97                     break;
 98                 case StandardShortcut.Close:
 99                     KeyDown(Keys.Alt);
100                     KeyPress(Keys.F4);
101                     KeyUp(Keys.Alt);
102                     break;
103                 case StandardShortcut.Print:
104                     KeyDown(Keys.Control);
105                     KeyPress(Keys.P);
106                     KeyUp(Keys.Control);
107                     break;
108             }
109         }
110  
111         static byte ParseKey(Keys key)
112         {
113  
114             // Alt, Shift, and Control need to be changed for API function to work with them
115             switch (key)
116             {
117                 case Keys.Alt:
118                     return (byte)18;
119                 case Keys.Control:
120                     return (byte)17;
121                 case Keys.Shift:
122                     return (byte)16;
123                 default:
124                     return (byte)key;
125             }
126  
127         } 
128  
129         #endregion
130  
131     }
132  
133 }
  1 using System;
  2 using System.Text;
  3 using System.Windows.Forms;
  4 using System.Runtime.InteropServices;
  5  
  6 namespace MouseKeyboardLibrary
  7 {
  8  
  9     /// <summary>
 10     /// Captures global mouse events
 11     /// </summary>
 12     public class MouseHook : GlobalHook
 13     {
 14  
 15         #region MouseEventType Enum
 16  
 17         private enum MouseEventType
 18         {
 19             None,
 20             MouseDown,
 21             MouseUp,
 22             DoubleClick,
 23             MouseWheel,
 24             MouseMove
 25         }
 26  
 27         #endregion
 28  
 29         #region Events
 30  
 31         public event MouseEventHandler MouseDown;
 32         public event MouseEventHandler MouseUp;
 33         public event MouseEventHandler MouseMove;
 34         public event MouseEventHandler MouseWheel;
 35  
 36         public event EventHandler Click;
 37         public event EventHandler DoubleClick;
 38  
 39         #endregion
 40  
 41         #region Constructor
 42  
 43         public MouseHook()
 44         {
 45  
 46             _hookType = WH_MOUSE_LL;
 47  
 48         }
 49  
 50         #endregion
 51  
 52         #region Methods
 53  
 54         protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)
 55         {
 56             
 57             if (nCode > -1 && (MouseDown != null || MouseUp != null || MouseMove != null))
 58             {
 59  
 60                 MouseLLHookStruct mouseHookStruct =
 61                     (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));
 62  
 63                 MouseButtons button = GetButton(wParam);
 64                 MouseEventType eventType = GetEventType(wParam);
 65  
 66                 MouseEventArgs e = new MouseEventArgs(
 67                     button,
 68                     (eventType == MouseEventType.DoubleClick ? 2 : 1),
 69                     mouseHookStruct.pt.x,
 70                     mouseHookStruct.pt.y,
 71                     (eventType == MouseEventType.MouseWheel ? (short)((mouseHookStruct.mouseData >> 16) & 0xffff) : 0));
 72  
 73                 // Prevent multiple Right Click events (this probably happens for popup menus)
 74                 if (button == MouseButtons.Right && mouseHookStruct.flags != 0)
 75                 {
 76                     eventType = MouseEventType.None;
 77                 }
 78  
 79                 switch (eventType)
 80                 {
 81                     case MouseEventType.MouseDown:
 82                         if (MouseDown != null)
 83                         {
 84                             MouseDown(this, e);
 85                         }
 86                         break;
 87                     case MouseEventType.MouseUp:
 88                         if (Click != null)
 89                         {
 90                             Click(this, new EventArgs());
 91                         }
 92                         if (MouseUp != null)
 93                         {
 94                             MouseUp(this, e);
 95                         }
 96                         break;
 97                     case MouseEventType.DoubleClick:
 98                         if (DoubleClick != null)
 99                         {
100                             DoubleClick(this, new EventArgs());
101                         }
102                         break;
103                     case MouseEventType.MouseWheel:
104                         if (MouseWheel != null)
105                         {
106                             MouseWheel(this, e);
107                         }
108                         break;
109                     case MouseEventType.MouseMove:
110                         if (MouseMove != null)
111                         {
112                             MouseMove(this, e);
113                         }
114                         break;
115                     default:
116                         break;
117                 }
118                 
119             }
120  
121             return CallNextHookEx(_handleToHook, nCode, wParam, lParam);
122  
123         }
124  
125         private MouseButtons GetButton(Int32 wParam)
126         {
127  
128             switch (wParam)
129             {
130  
131                 case WM_LBUTTONDOWN:
132                 case WM_LBUTTONUP:
133                 case WM_LBUTTONDBLCLK:
134                     return MouseButtons.Left;
135                 case WM_RBUTTONDOWN:
136                 case WM_RBUTTONUP:
137                 case WM_RBUTTONDBLCLK:
138                     return MouseButtons.Right;
139                 case WM_MBUTTONDOWN:
140                 case WM_MBUTTONUP:
141                 case WM_MBUTTONDBLCLK:
142                     return MouseButtons.Middle;
143                 default:
144                     return MouseButtons.None;
145  
146             }
147  
148         }
149  
150         private MouseEventType GetEventType(Int32 wParam)
151         {
152  
153             switch (wParam)
154             {
155  
156                 case WM_LBUTTONDOWN:
157                 case WM_RBUTTONDOWN:
158                 case WM_MBUTTONDOWN:
159                     return MouseEventType.MouseDown;
160                 case WM_LBUTTONUP:
161                 case WM_RBUTTONUP:
162                 case WM_MBUTTONUP:
163                     return MouseEventType.MouseUp;
164                 case WM_LBUTTONDBLCLK:
165                 case WM_RBUTTONDBLCLK:
166                 case WM_MBUTTONDBLCLK:
167                     return MouseEventType.DoubleClick;
168                 case WM_MOUSEWHEEL:
169                     return MouseEventType.MouseWheel;
170                 case WM_MOUSEMOVE:
171                     return MouseEventType.MouseMove;
172                 default:
173                     return MouseEventType.None;
174  
175             }
176         }
177  
178         #endregion
179         
180     }
181  
182 }
  1 using System;
  2 using System.Text;
  3 using System.Runtime.InteropServices;
  4 using System.Drawing;
  5 using System.Windows.Forms;
  6  
  7 namespace MouseKeyboardLibrary
  8 {
  9  
 10     /// <summary>
 11     /// And X, Y point on the screen
 12     /// </summary>
 13     public struct MousePoint
 14     {
 15  
 16         public MousePoint(Point p)
 17         {
 18             X = p.X;
 19             Y = p.Y;
 20         }
 21  
 22         public int X;
 23         public int Y;
 24  
 25         public static implicit operator Point(MousePoint p)
 26         {
 27             return new Point(p.X, p.Y);
 28         }
 29  
 30     }
 31  
 32     /// <summary>
 33     /// Mouse buttons that can be pressed
 34     /// </summary>
 35     public enum MouseButton
 36     {
 37         Left = 0x2,
 38         Right = 0x8,
 39         Middle = 0x20
 40     }
 41  
 42     /// <summary>
 43     /// Operations that simulate mouse events
 44     /// </summary>
 45     public static class MouseSimulator
 46     {
 47  
 48         #region Windows API Code
 49  
 50         [DllImport("user32.dll")]
 51         static extern int ShowCursor(bool show);
 52  
 53         [DllImport("user32.dll")]
 54         static extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo);
 55  
 56         const int MOUSEEVENTF_MOVE = 0x1;
 57         const int MOUSEEVENTF_LEFTDOWN = 0x2;
 58         const int MOUSEEVENTF_LEFTUP = 0x4;
 59         const int MOUSEEVENTF_RIGHTDOWN = 0x8;
 60         const int MOUSEEVENTF_RIGHTUP = 0x10;
 61         const int MOUSEEVENTF_MIDDLEDOWN = 0x20;
 62         const int MOUSEEVENTF_MIDDLEUP = 0x40;
 63         const int MOUSEEVENTF_WHEEL = 0x800;
 64         const int MOUSEEVENTF_ABSOLUTE = 0x8000; 
 65  
 66         #endregion
 67  
 68         #region Properties
 69  
 70         /// <summary>
 71         /// Gets or sets a structure that represents both X and Y mouse coordinates
 72         /// </summary>
 73         public static MousePoint Position
 74         {
 75             get
 76             {
 77                 return new MousePoint(Cursor.Position);
 78             }
 79             set
 80             {
 81                 Cursor.Position = value;
 82             }
 83         }
 84  
 85         /// <summary>
 86         /// Gets or sets only the mouse's x coordinate
 87         /// </summary>
 88         public static int X
 89         {
 90             get
 91             {
 92                 return Cursor.Position.X;
 93             }
 94             set
 95             {
 96                 Cursor.Position = new Point(value, Y);
 97             }
 98         }
 99  
100         /// <summary>
101         /// Gets or sets only the mouse's y coordinate
102         /// </summary>
103         public static int Y
104         {
105             get
106             {
107                 return Cursor.Position.Y;
108             }
109             set
110             {
111                 Cursor.Position = new Point(X, value);
112             }
113         } 
114  
115         #endregion
116  
117         #region Methods
118  
119         /// <summary>
120         /// Press a mouse button down
121         /// </summary>
122         /// <param name="button"></param>
123         public static void MouseDown(MouseButton button)
124         {
125             mouse_event(((int)button), 0, 0, 0, 0);
126         }
127  
128         public static void MouseDown(MouseButtons button)
129         {
130             switch (button)
131             {
132                 case MouseButtons.Left:
133                     MouseDown(MouseButton.Left);
134                     break;
135                 case MouseButtons.Middle:
136                     MouseDown(MouseButton.Middle);
137                     break;
138                 case MouseButtons.Right:
139                     MouseDown(MouseButton.Right);
140                     break;
141             }
142         }
143  
144         /// <summary>
145         /// Let a mouse button up
146         /// </summary>
147         /// <param name="button"></param>
148         public static void MouseUp(MouseButton button)
149         {
150             mouse_event(((int)button) * 2, 0, 0, 0, 0);
151         }
152  
153         public static void MouseUp(MouseButtons button)
154         {
155             switch (button)
156             {
157                 case MouseButtons.Left:
158                     MouseUp(MouseButton.Left);
159                     break;
160                 case MouseButtons.Middle:
161                     MouseUp(MouseButton.Middle);
162                     break;
163                 case MouseButtons.Right:
164                     MouseUp(MouseButton.Right);
165                     break;
166             }
167         }
168  
169         /// <summary>
170         /// Click a mouse button (down then up)
171         /// </summary>
172         /// <param name="button"></param>
173         public static void Click(MouseButton button)
174         {
175             MouseDown(button);
176             MouseUp(button);
177         }
178  
179         public static void Click(MouseButtons button)
180         {
181             switch (button)
182             {
183                 case MouseButtons.Left:
184                     Click(MouseButton.Left);
185                     break;
186                 case MouseButtons.Middle:
187                     Click(MouseButton.Middle);
188                     break;
189                 case MouseButtons.Right:
190                     Click(MouseButton.Right);
191                     break;
192             }
193         }
194  
195         /// <summary>
196         /// Double click a mouse button (down then up twice)
197         /// </summary>
198         /// <param name="button"></param>
199         public static void DoubleClick(MouseButton button)
200         {
201             Click(button);
202             Click(button);
203         }
204  
205         public static void DoubleClick(MouseButtons button)
206         {
207             switch (button)
208             {
209                 case MouseButtons.Left:
210                     DoubleClick(MouseButton.Left);
211                     break;
212                 case MouseButtons.Middle:
213                     DoubleClick(MouseButton.Middle);
214                     break;
215                 case MouseButtons.Right:
216                     DoubleClick(MouseButton.Right);
217                     break;
218             }
219         }
220  
221         /// <summary>
222         /// Show a hidden current on currently application
223         /// </summary>
224         public static void Show()
225         {
226             ShowCursor(true);
227         }
228  
229         /// <summary>
230         /// Hide mouse cursor only on current application's forms
231         /// </summary>
232         public static void Hide()
233         {
234             ShowCursor(false);
235         } 
236  
237         #endregion
238  
239     }
240  
241 }
  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9  
 10 using MouseKeyboardLibrary;
 11  
 12 namespace SampleApplication
 13 {
 14     /*
 15       上面的5个类编译成Dll引用,使用例子
 16      */
 17     public partial class HookTestForm : Form
 18     {
 19  
 20         MouseHook mouseHook = new MouseHook();
 21         KeyboardHook keyboardHook = new KeyboardHook();
 22  
 23         public HookTestForm()
 24         {
 25             InitializeComponent();
 26         }
 27  
 28         private void TestForm_Load(object sender, EventArgs e)
 29         {
 30  
 31             mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);
 32             mouseHook.MouseDown += new MouseEventHandler(mouseHook_MouseDown);
 33             mouseHook.MouseUp += new MouseEventHandler(mouseHook_MouseUp);
 34             mouseHook.MouseWheel += new MouseEventHandler(mouseHook_MouseWheel);
 35  
 36             keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);
 37             keyboardHook.KeyUp += new KeyEventHandler(keyboardHook_KeyUp);
 38             keyboardHook.KeyPress += new KeyPressEventHandler(keyboardHook_KeyPress);
 39  
 40             mouseHook.Start();
 41             keyboardHook.Start();
 42  
 43             SetXYLabel(MouseSimulator.X, MouseSimulator.Y);
 44  
 45         }
 46  
 47         void keyboardHook_KeyPress(object sender, KeyPressEventArgs e)
 48         {
 49  
 50             AddKeyboardEvent(
 51                 "KeyPress",
 52                 "",
 53                 e.KeyChar.ToString(),
 54                 "",
 55                 "",
 56                 ""
 57                 );
 58  
 59         }
 60  
 61         void keyboardHook_KeyUp(object sender, KeyEventArgs e)
 62         {
 63  
 64             AddKeyboardEvent(
 65                 "KeyUp",
 66                 e.KeyCode.ToString(),
 67                 "",
 68                 e.Shift.ToString(),
 69                 e.Alt.ToString(),
 70                 e.Control.ToString()
 71                 );
 72  
 73         }
 74  
 75         void keyboardHook_KeyDown(object sender, KeyEventArgs e)
 76         {
 77  
 78  
 79             AddKeyboardEvent(
 80                 "KeyDown",
 81                 e.KeyCode.ToString(),
 82                 "",
 83                 e.Shift.ToString(),
 84                 e.Alt.ToString(),
 85                 e.Control.ToString()
 86                 );
 87  
 88         }
 89  
 90         void mouseHook_MouseWheel(object sender, MouseEventArgs e)
 91         {
 92  
 93             AddMouseEvent(
 94                 "MouseWheel",
 95                 "",
 96                 "",
 97                 "",
 98                 e.Delta.ToString()
 99                 );
100  
101         }
102  
103         void mouseHook_MouseUp(object sender, MouseEventArgs e)
104         {
105  
106  
107             AddMouseEvent(
108                 "MouseUp",
109                 e.Button.ToString(),
110                 e.X.ToString(),
111                 e.Y.ToString(),
112                 ""
113                 );
114  
115         }
116  
117         void mouseHook_MouseDown(object sender, MouseEventArgs e)
118         {
119  
120  
121             AddMouseEvent(
122                 "MouseDown",
123                 e.Button.ToString(),
124                 e.X.ToString(),
125                 e.Y.ToString(),
126                 ""
127                 );
128  
129  
130         }
131  
132         void mouseHook_MouseMove(object sender, MouseEventArgs e)
133         {
134  
135             SetXYLabel(e.X, e.Y);
136  
137         }
138  
139         void SetXYLabel(int x, int y)
140         {
141  
142             curXYLabel.Text = String.Format("Current Mouse Point: X={0}, y={1}", x, y);
143  
144         }
145  
146         void AddMouseEvent(string eventType, string button, string x, string y, string delta)
147         {
148  
149             listView1.Items.Insert(0,
150                 new ListViewItem(
151                     new string[]{
152                         eventType, 
153                         button,
154                         x,
155                         y,
156                         delta
157                     }));
158  
159         }
160  
161         void AddKeyboardEvent(string eventType, string keyCode, string keyChar, string shift, string alt, string control)
162         {
163  
164             listView2.Items.Insert(0,
165                  new ListViewItem(
166                      new string[]{
167                         eventType, 
168                         keyCode,
169                         keyChar,
170                         shift,
171                         alt,
172                         control
173                 }));
174  
175         }
176  
177         private void TestForm_FormClosed(object sender, FormClosedEventArgs e)
178         {
179  
180             // Not necessary anymore, will stop when application exits
181  
182             //mouseHook.Stop();
183             //keyboardHook.Stop();
184  
185         }
186  
187  
188     }
189 }
原文地址:https://www.cnblogs.com/zouhao/p/13125518.html