本文所述为基于C#实现的HOOK实例,该实例可用来屏蔽系统热键。程序主要实现了安装钩子、传递钩子、卸载钩子等功能。在传递钩子中:
<param name="pHookHandle">是您自己的钩子函数的句柄。用该句柄可以遍历钩子链</param>
<param name="nCode">把传入的参数简单传给CallNextHookEx即可</param>
<param name="wParam">把传入的参数简单传给CallNextHookEx即可</param>,
在HOOK类中定义了一些私有变量:键盘钩子句柄、键盘钩子委托实例、底层的钩子变量等。在钩子捕获消息后,对消息进行处理。

具体实现HOOK代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;
namespace 设置和屏蔽系统热键
{
class HOOK
{
#region 私有变量
private IntPtr m_pKeyboardHook = IntPtr.Zero;/// 键盘钩子句柄
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// 钩子委托声明
private HookProc m_KeyboardHookProcedure;/// 键盘钩子委托实例
public const int idHook = ;/// 底层的钩子变量
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr pInstance, int threadId);/// 安装钩子
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]/// 卸载钩子
public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);
/// 传递钩子
/// <param name="pHookHandle">是您自己的钩子函数的句柄。用该句柄可以遍历钩子链</param>
/// <param name="nCode">把传入的参数简单传给CallNextHookEx即可</param>
/// <param name="wParam">把传入的参数简单传给CallNextHookEx即可</param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(IntPtr pHookHandle, int nCode, Int32 wParam, IntPtr lParam);
[StructLayout(LayoutKind.Sequential)]
public struct KeyMSG
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
protected const int WM_QUERYENDSESSION = 0x0011;
protected const int WM_KEYDOWN = 0x100;
protected const int WM_KEYUP = 0x101;
protected const int WM_SYSKEYDOWN = 0x104;
protected const int WM_SYSKEYUP = 0x105;
protected const byte VK_SHIFT = 0x10;
protected const byte VK_CAPITAL = 0x14;
protected const byte VK_NUMLOCK = 0x90;
protected const byte VK_LSHIFT = 0xA0;
protected const byte VK_RSHIFT = 0xA1;
protected const int VK_LWIN = ;
protected const int VK_RWIN = ;
protected const byte VK_LCONTROL = 0xA2;
protected const byte VK_RCONTROL = 0x3;
protected const byte VK_LALT = 0xA4;
protected const byte VK_RALT = 0xA5;
protected const byte LLKHF_ALTDOWN = 0x20;
public bool Porwer = true;//是否屏蔽Porwer键
public static int pp = ;//热键的返回值
public static bool isSet = false;//是否设置屏蔽热键,false为设置屏蔽的热键
public static bool isHotkey = false;
public static bool isInstall = false;//是否安装钩子,true为安装
#endregion
#region 事件的声明
public event KeyEventHandler KeyDown;//键盘按下事件
public event KeyEventHandler KeyUp;//键盘松开事件
public event KeyPressEventHandler KeyPress;//键盘单击事件
#endregion
#region 方法
/// <summary>
/// 钩子捕获消息后,对消息进行处理
/// </summary>
/// <param nCode="int">标识,键盘是否操作</param>
/// <param wParam="int">键盘的操作值</param>
/// <param lParam="IntPtr">指针</param>
private int KeyboardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode > - && (KeyDown != null || KeyUp != null || KeyPress != null))
{
KeyMSG keyboardHookStruct = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));//获取钩子的相关信息
KeyEventArgs e = new KeyEventArgs((Keys)(keyboardHookStruct.vkCode));//获取KeyEventArgs事件的相磁信息
switch (wParam)
{
case WM_KEYDOWN://键盘按下操作
case WM_SYSKEYDOWN:
if (KeyDown != null)//如果加载了当前事件
{
KeyDown(this, e);//调用该事件
}
break;
case WM_KEYUP://键盘松开操作
case WM_SYSKEYUP:
if (KeyUp != null)//如果加载了当前事件
{
KeyUp(this, e);//调用该事件
}
break;
}
}
return pp;//是否屏蔽当前热键,1为屏蔽,2为执行
}
#endregion
#region 安装、卸载钩子
/// <summary>
/// 安装钩子
/// </summary>
/// <returns>是否安装成功</returns>
public bool Start()
{
IntPtr pInstance = (IntPtr);//钩子所在实例的句柄
if (this.m_pKeyboardHook == IntPtr.Zero)//如果键盘的句柄为空
{
this.m_KeyboardHookProcedure = new HookProc(KeyboardHookProc);//声明一个托管钩子
this.m_pKeyboardHook = SetWindowsHookEx(idHook, m_KeyboardHookProcedure, pInstance, );//安装钩子
if (this.m_pKeyboardHook == IntPtr.Zero)//如果安装失败
{
this.Stop();//卸载钩子
return false;
}
}
isInstall = true;//安装了钩子
return true;
}
/// <summary>
/// 卸载钩子
/// </summary>
/// <returns>是否卸载成功</returns>
public bool Stop()
{
if (isInstall == false)//如果没有安装钩子
{
return true;
}
bool result = true;
if (this.m_pKeyboardHook != IntPtr.Zero)//如果安装了钩子
{
result = (UnhookWindowsHookEx(this.m_pKeyboardHook) && result);//卸载钩子
this.m_pKeyboardHook = IntPtr.Zero;//清空键盘的钩子句柄
}
return result;
}
#endregion 公共方法
}
}

基于C#实现的HOOK键盘钩子实例代码的更多相关文章

  1. hook键盘钩子 带dll

    library Key; uses SysUtils, Classes, HookKey_Unit in 'HookKey_Unit.pas'; {$R *.res} exports HookOn,H ...

  2. C# Hook钩子实例代码之截取键盘输入,需要的朋友可以参考下

    一.关于本文 以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址: http://www.microsoft.com/china/community/program/origin ...

  3. hook键盘钩子_非dll

    unit Unit1; // download by http://www.codefans.net interface uses Windows, Messages, SysUtils, Class ...

  4. js鼠标事件、键盘事件实例代码

    讲述了:鼠标的哪个按键被点击.当前鼠标的光标坐标是多少.被按下键的unicode码是多少.当前鼠标的光标相对于屏幕的坐标是多少.当前鼠标的光标坐标是多少.shift键是否按下.当前被点击的是哪一个元素 ...

  5. js鼠标、键盘事件实例代码

    1. 鼠标的哪个按键被点击? <html> <head> <script type="text/javascript"> function wh ...

  6. HOOK API (一)——HOOK基础+一个鼠标钩子实例

    HOOK API (一)——HOOK基础+一个鼠标钩子实例 0x00 起因 最近在做毕业设计,有一个功能是需要实现对剪切板的监控和进程的防终止保护.原本想从内核层实现,但没有头绪.最后决定从调用层入手 ...

  7. 钩子编程(HOOK) 安装进程内键盘钩子 (1)

    摘要:钩子能够监视系统或进程中的各种事件消息.截获发往目标窗体的消息并进行处理.这样,我们就能够在系统中安装自己定义的钩子,监视系统中特定事件的发生.完毕特定的功能,比方截获键盘.鼠标的输入.屏幕取词 ...

  8. hook 鼠标键盘消息实例分析

    1.木马控制及通信方法包含:双管道,port重用.反弹技术.Hook技术,今天重点引用介绍一下hook的使用方法,hook信息后能够将结果发送到hacker邮箱等.实现攻击的目的. 转自:http:/ ...

  9. WPF 利用键盘钩子来捕获键盘,做一些不为人知的事情...完整实例

    键盘钩子是一种可以监控键盘操作的指令. 看到这句话是不是觉得其实键盘钩子可以做很多事情. 场景 当你的程序需要一个全局的快捷键时,可以考虑使用键盘钩子,如大家常用qq的截图快捷键,那么在WPF里怎么去 ...

随机推荐

  1. 面试题收集——Java基础部分(一)

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3641769.html 感谢! 1.一个".java"源文件中是否可以包括多个类(不是内部类) ...

  2. Kali Linux 安装教程-转

    rootoorotor昨天折腾了 Kali Linux 1.0,把大概的配置过程记录下来,希望对想接触或使用Kali Linux的同学有所帮助.   请注意: 1.本文为面向新手的教程,没技术含量,没 ...

  3. 给Adobe Reader添加书签功能

    Adobe Acrobat Professional和Adobe Reader都是Adobe公司的产品.前者用来编辑制作PDF文档,后者只能用来阅读PDF.令人郁闷的是Adobe Reader中虽然有 ...

  4. [iOS微博项目 - 3.2] - 发送微博

    github: https://github.com/hellovoidworld/HVWWeibo   A.使用微博API发送微博 1.需求 学习发送微博API 发送文字微博 发送带有图片的微博   ...

  5. javascript日期格式化方法汇总

    本文给大家汇总介绍了javascript格式化日期时间的几种常用方法,个人对最后一种个性化输出时间比较有兴趣,基本上只要项目中能用到都是使用这种,推荐给小伙伴们. 方法一: ? 1 2 3 4 5 6 ...

  6. CreateEvent的用法

    事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”.可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是”无信号”就让该 ...

  7. linux自启动服务方式

    方式一: /etc/init.d/servicename  restart 编写 /etc/init.d/ 下面的标准的服务shell脚本 方式二: vim /etc/rc.local  /home/ ...

  8. CentOS6 下安装JDK7

    1.下载JDK:http://www.oracle.com/technetwork/java/javase/archive-139210.html,选择Java SE 7,下载jdk-7u80-lin ...

  9. 【tcl脚本】改变输出字符格式

    需求: 原list输出格式 0x00 0x50 0x01 0x03 0x04 0x02 0x21 0x57 0x01 0x00 0x05 0x0B 0x03 0x13 0x00 0x01 要求list ...

  10. Binding的Source从何而来?

    I. Binding to Object 1. Binding data using ObjectDataProvider AC:Let’s say there is a CLR based data ...