参考的文章,出处不详。

了解钩子

从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前处理些Windows消息。

消息截获顺序:既然是截获消息,总要有先有后,钩子是按加入到钩子链表的顺序决定消息截获顺序。就是说最后加入到链表的钩子最先得到消息。

截获范围:钩子分为线程钩子和全局钩子,线程钩子只能截获本线程的消息,全局钩子可以截获整个系统消息。我认为应该尽量使用线程钩子,全局钩子如果使用不当可能会影响到其他程序。

安装钩子和卸载钩子关键就是SetWindowsHookEx和UnhookWindowsHookEx方法。

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

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

lpfn 钩子子程的地址指针。如果dwThreadId参数为0 或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。 除此以外,lpfn可以指向当前进程的一段钩子子程代码。钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。

hInstance应用程序实例的句柄。标识包含lpfn所指的子程的DLL。如果threadId 标识当前进程创建的一个线程,而且子程代码位于当前进程,hInstance必须为NULL。可以很简单的设定其为本应用程序的实例句柄。

threaded 与安装的钩子子程相关联的线程的标识符。如果为0,钩子子程与所有的线程关联,即为全局钩子。

上面代码中的SetWindowsHookEx方法安装的是线程钩子,用GetCurrentThreadId()函数得到当前的线程ID,钩子就只监听当前线程的键盘消息。

UnhookWindowsHookEx (int idHook) 函数用来卸载钩子,卸载钩子与加入钩子链表的顺序无关,并非后进先出。

实例

 public partial class Form1 : Form{public delegate int HookProc(int nCode,IntPtr wParam,IntPtr lParam);//定义钩子句柄public static int hHook = 0;//定义钩子类型,可以截获整个系统所有模块的鼠标事件public const int WH_MOUSE_LL = 14;public HookProc MyProcedure;//安装钩子[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook,           //钩子类型HookProc lpfn,        //回调函数地址IntPtr hInstance,     //实例句柄,钩子所在的实例的句柄int threadId);        //线程ID,钩子所监视的线程的线程ID//卸载钩子[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, IntPtr wParam, IntPtr lParam);[StructLayout(LayoutKind.Sequential)]public class POINT{public int x;public int y;}[StructLayout(LayoutKind.Sequential)]public class MouseHookStruct{public POINT pt;public int hwnd;public int wHitTestCode;public int dwExtraInfo;}public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){if (hHook == 0){MyProcedure = new HookProc(this.MouseHookProc);//这里挂节钩子hHook = SetWindowsHookEx(WH_MOUSE_LL, MyProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);if (hHook == 0){MessageBox.Show("SetWindowsHookEx Failed");return;}button1.Text = "卸载钩子";}else{bool ret = UnhookWindowsHookEx(hHook);if (ret == false){MessageBox.Show("UnhookWindowsHookEx Failed");return;}hHook = 0;button1.Text = "安装钩子";}}public int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam){MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));if (nCode < 0){return CallNextHookEx(hHook, nCode, wParam, lParam);}else{String strCaption = "x = " + MyMouseHookStruct.pt.x.ToString("d") + "  y = " + MyMouseHookStruct.pt.y.ToString("d");this.Text = strCaption;return CallNextHookEx(hHook, nCode, wParam, lParam);}}}

禁用button回车事件,不然会导致程序莫名奇妙挂掉,还没有任何提示信息。

线程钩子HookC#实例相关推荐

  1. 【转载】Hook钩子C#实例

    转过来的文章,出处已经不知道了,但只这篇步骤比较清晰,就贴出来了. 一.写在最前 本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址: http://www.mic ...

  2. Hook钩子C#实例

    转过来的文章,出处已经不知道了,但只这篇步骤比较清晰,就贴出来了. 一.写在最前 本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址: http://www.mic ...

  3. java 父线程_Java父线程(或是主线程)等待所有子线程退出的实例

    导读热词 实例如下: static void testLock1(){ final AtomicInteger waitCount = new AtomicInteger(30000); final ...

  4. Shell多线程操作及线程数控制实例

    来源:http://www.jb51.net/article/51720.htm 这篇文章主要介绍了Shell多线程操作及线程数控制实例,文中从单线程实现一个需求开始,不断加入代码实现多线程以及线程数 ...

  5. java线程实例题_java线程相关试题实例源码代码

    java线程相关试题实例源码代码. /** * 计算输出其他线程锁计算的数据 */ class ThreadA { public static void main(String[] args) { T ...

  6. linux线程池简单实例

    linux线程池简单实例 转载于:https://www.cnblogs.com/adong7639/p/5044685.html

  7. java线程和内核线程的,Java中内核线程理论及实例详解

    1.概念 内核线程是直接由操作系统内核控制的,内核通过调度器来完成内核线程的调度并负责将其映射到处理器上执行.内核态下的线程执行速度理论上是最高的,但是用户不会直接操作内核线程,而是通过内核线程的接口 ...

  8. python ThreadPoolExecutor线程池(实例)

    初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程 ...

  9. java 线程钩子_高级并发编程系列六(线程池钩子函数)

    1.考考你 国庆假期快要结束了,准备回到工作岗位的你,是不是已经开始撸起袖子敲代码,反正发完文章我就要准备去加班了,程序员就这样,有干劲对吧 那么来吧,让我们一起分享完高级并发编程系列中,线程池小节的 ...

最新文章

  1. javascript 之clientHeight、scrollHeight、offsetHeight
  2. Android5.1设备无法识别exFAT文件系统的64G TF卡问题
  3. CMake基础 第8节 包含第三方库
  4. 2017年关于数据科学的六大预言
  5. nginx/tengine设置响应头中的cookie属性
  6. Qomolangma实现篇(三):兼容层设计
  7. [正则表达式] 正则表达式匹配UUID
  8. 东北林大计算机考研难吗,北京林业大学考研难吗?一般要什么水平才可以进入?...
  9. 在centos上安装html,Centos-7安装pdf2htmlEX
  10. 联手寒武纪发布AI推理服务器,推出AI管理平台,中科曙光也All in AI
  11. 《Ruby程序员修炼之道》(第2版)—第1章1.1节进入Ruby的世界
  12. python123电脑登录不了_python(14)- 简单练习:登录账户失败三次,账户自动锁定...
  13. 罗胖又有“惊人之语”:内容收费的窗口期正来到
  14. Atitit 软件理论方面的书籍 目录 1. 计算机科学分为计算机理论和计算机应用。 计算机基础理论包含以下几部分: 2 1.1. ( 1) 程序理论( 程序逻辑、程序正确性验证、形式开发方法等
  15. 人力资源管理学习网站推荐
  16. Citrix XenApp工作原理
  17. SAP MM物料管理系统功能详解
  18. EAccessViolation 地址访问错误
  19. 讯飞语音转写json结果格式化,提取文字(基于python)
  20. SMS 短信 API 接口调用

热门文章

  1. Star CCM+ 案例 - 旋风分离器 (cyclone separator)-3 模拟设置
  2. Excel打开CSV格式,大数字乱码情况
  3. 计蒜客题解——T1244:单词序列
  4. 代码整洁之道(上篇)
  5. python中close_Python pool.close方法代码示例
  6. 前苏联人民热情拥抱小企鹅
  7. MySQL是如何解决幻读
  8. Android应用利用libusb设备通信权限问题
  9. Minos嵌入式虚拟化方案 - 系统架构介绍
  10. Gerrit代码审查使用教程