C#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例

2019-12-30 12:48:22于丽

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MouseKeyboardLibrary;
namespace SampleApplication
{
  /*
   上面的5个类编译成Dll引用,使用例子
   */
  public partial class HookTestForm : Form
  {
    MouseHook mouseHook = new MouseHook();
    KeyboardHook keyboardHook = new KeyboardHook();
    public HookTestForm()
    {
      InitializeComponent();
    }
    private void TestForm_Load(object sender, EventArgs e)
    {
      mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);
      mouseHook.MouseDown += new MouseEventHandler(mouseHook_MouseDown);
      mouseHook.MouseUp += new MouseEventHandler(mouseHook_MouseUp);
      mouseHook.MouseWheel += new MouseEventHandler(mouseHook_MouseWheel);
      keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);
      keyboardHook.KeyUp += new KeyEventHandler(keyboardHook_KeyUp);
      keyboardHook.KeyPress += new KeyPressEventHandler(keyboardHook_KeyPress);
      mouseHook.Start();
      keyboardHook.Start();
      SetXYLabel(MouseSimulator.X, MouseSimulator.Y);
    }
    void keyboardHook_KeyPress(object sender, KeyPressEventArgs e)
    {
      AddKeyboardEvent(
        "KeyPress",
        "",
        e.KeyChar.ToString(),
        "",
        "",
        ""
        );
    }
    void keyboardHook_KeyUp(object sender, KeyEventArgs e)
    {
      AddKeyboardEvent(
        "KeyUp",
        e.KeyCode.ToString(),
        "",
        e.Shift.ToString(),
        e.Alt.ToString(),
        e.Control.ToString()
        );
    }
    void keyboardHook_KeyDown(object sender, KeyEventArgs e)
    {
      AddKeyboardEvent(
        "KeyDown",
        e.KeyCode.ToString(),
        "",
        e.Shift.ToString(),
        e.Alt.ToString(),
        e.Control.ToString()
        );
    }
    void mouseHook_MouseWheel(object sender, MouseEventArgs e)
    {
      AddMouseEvent(
        "MouseWheel",
        "",
        "",
        "",
        e.Delta.ToString()
        );
    }
    void mouseHook_MouseUp(object sender, MouseEventArgs e)
    {
      AddMouseEvent(
        "MouseUp",
        e.Button.ToString(),
        e.X.ToString(),
        e.Y.ToString(),
        ""
        );
    }
    void mouseHook_MouseDown(object sender, MouseEventArgs e)
    {
      AddMouseEvent(
        "MouseDown",
        e.Button.ToString(),
        e.X.ToString(),
        e.Y.ToString(),
        ""
        );
    }
    void mouseHook_MouseMove(object sender, MouseEventArgs e)
    {
      SetXYLabel(e.X, e.Y);
    }
    void SetXYLabel(int x, int y)
    {
      curXYLabel.Text = String.Format("Current Mouse Point: X={0}, y={1}", x, y);
    }
    void AddMouseEvent(string eventType, string button, string x, string y, string delta)
    {
      listView1.Items.Insert(0,
        new ListViewItem(
          new string[]{
            eventType,
            button,
            x,
            y,
            delta
          }));
    }
    void AddKeyboardEvent(string eventType, string keyCode, string keyChar, string shift, string alt, string control)
    {
      listView2.Items.Insert(0,
         new ListViewItem(
           new string[]{
            eventType,
            keyCode,
            keyChar,
            shift,
            alt,
            control
        }));
    }
    private void TestForm_FormClosed(object sender, FormClosedEventArgs e)
    {
      // Not necessary anymore, will stop when application exits
      //mouseHook.Stop();
      //keyboardHook.Stop();
    }
  }
}