现在的位置: 首页 > 综合 > 正文

全局键盘钩子开发实例

2013年10月10日 ⁄ 综合 ⁄ 共 993字 ⁄ 字号 评论关闭

功能:启动软件,不管输入焦点是否在本软件中,都能实现监控。

模块功能设计:1.DLL模块,在DLL中利用钩子技术完成键盘监控和播放声音文件功能;2.界面模块,调用DLL启动和停止键盘监控功能。

一、钩子概述

1.钩子是一段处理系统消息的应用程序,通过系统调用,将其挂入系统。

    如果HOOK过程在应用程序中实现,若应用程序不是当前窗口,该HOOK不起作用;如果HOOK在DLL中实现,程序在运行中调用它,它能实时对系统进行监控。根据需要,一般是在DLL中实现HOOK方式。

二、系统钩子和线程钩子

    在Windows中,钩子有两种,一种是系统钩子(RemoteHook),它对消息的监视是整个系统范围;另一种是线程钩子(LocalHook),它拦截进程内部消息。

    当一个事件发生时,如果安装的是一个局部钩子,当前进程中的钩子函数被调用。如果是个远程钩子,系统就必须把钩子函数出入到其他进程的地址空间中去,要做到这一点就要求钩子函数必须在一个动态链接库中实现。

三、键盘钩子的分类

1.WH_KEYBOARD

2.WH_KEYBOARD_LL

四、编写钩子函数

    钩子程序三部曲:定义钩子函数、安装和卸载钩子。

五、Win32 DLL

    在Win32环境中,所有应用程序都有自己的私有空间,每个进程的空间都是相互独立的。当进程载入DLL时,系统会把DLL地址映射到该进程的私有空间,而且也会复制该DLL中的全局数据,但是在不同的进程中,这些全局数据的值却不一定是相同的。因此,在Win32环境下,要想在多个进程中共享数据,就必须进行必要的设置,即把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。

    Visaul C++ 6.0中全局共享数据的实现如下:

     #pragma data_seg(“mysharedata”)

     HWND sharedwnd=NULL;

     #pragma data_seg()

    仅定义一个数据段还不能达到共享数据的目的,还要告诉编译器该段的属性,有两种方式可以实现该目的(其效果是相同的)。

    一种是在.def文件中加入以下语句

     SECTIONS

     mysharedata READ WRITE SHARED

    另一种是在项目设置链接选项加入如下语句:

     /SECTIONS:mysharedata,rws

抱歉!评论已关闭.