软件实现监听键盘事件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件实现监听键盘事件

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using System.Windows.Forms;

using System.Reflection;

class KeyboardHook

{

public event KeyEventHandler KeyDownEvent;

public event KeyPressEventHandler KeyPressEvent;

public event KeyEventHandler KeyUpEvent;

public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);

static int hKeyboardHook = 0; //声明键盘钩子处理的初始值

//值在Microsoft SDK的Winuser.h里查询

public const int WH_KEYBOARD_LL = 13; //线程键盘钩子监听鼠标消息设为2,全局键盘监听鼠标消息设为13

HookProc KeyboardHookProcedure; //声明KeyboardHookProcedure作为HookProc类型

//键盘结构

[StructLayout(LayoutKind.Sequential)]

public class KeyboardHookStruct

{

public int vkCode; //定一个虚拟键码。该代码必须有一个价值的范围1至254

public int scanCode; // 指定的硬件扫描码的关键

public int flags; // 键标志

public int time; // 指定的时间戳记的这个讯息

public int dwExtraInfo; // 指定额外信息相关的信息

}

//使用此功能,安装了一个钩子

[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, Int32 wParam, IntPtr lParam);

// 取得当前线程编号(线程钩子需要用到)

[DllImport("kernel32.dll")]

static extern int GetCurrentThreadId();

//使用WINDOWS API函数代替获取当前实例的函数,防止钩子失效

[DllImport("kernel32.dll")]

public static extern IntPtr GetModuleHandle(string name);

public void Start()

{

// 安装键盘钩子

if (hKeyboardHook == 0)

{

KeyboardHookProcedure = new HookProc(KeyboardHookProc);

hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure,

GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.Modul eName), 0);

//hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure,

Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);

//************************************

//键盘线程钩子

SetWindowsHookEx(13, KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId());//指定要监听的线程idGetCurrentThreadId(),

//键盘全局钩子,需要引用空间(using System.Reflection;)

//SetWindowsHookEx( 13,MouseHookProcedure,Marshal.GetHINSTANCE(Assembly.Ge tExecutingAssembly().GetModules()[0]),0);

//

//关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数将钩子加入到钩子链表中,说明一下四个参数:

//idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13,

//线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。lpfn 钩

相关文档
最新文档