C++如何禁用全局键盘钩子或者程序钩子?( 二 )


WPRAM:传输到挂钩进程的WPRAM参数值 。参数值的具体含义与当前钩子链的钩子类型有关 。
:传输给钩子进程的参数值 。参数值的具体含义与当前钩子链的钩子类型有关 。
返回值:返回值是链中下一个钩子子程返回的值 。当前钩子子程必须返回这个值 。返回值的具体含义与钩子的钩子类型有关 。具体请参考具体的hook流程描述 。
构建动态链接库(DLL)
当我们熟悉了上面的函数,就开始写动态链接库(dll)吧 。我这里用WIN32 DLL代替MFC DLL 。而下面的程序都是用C语言写的 。这主要是因为使用WIN32 API可以更细致更全面的控制程序的执行,而使用MFC,一些底层的控制是做不到的(当然MFC也可以只用于这个程序) 。
1.建立动态链接库 。Cpp文件 。例如,我们现在创建一个名为.cpp的文件 。
#包括.h
#包含“.h”
#包含“stdio.h”
hInst
# (" ")
HHOOK旧key hook = 0;
# ()
#注释(链接器,“/:,RWS”)
#dll" C " _ _ (dll )
回调(int nCode,,);
void安装挂钩(int nCode);
void结束钩(void);
BOOLdll main(hh,ULONG What,)
{
切换(什么)
{
案例:
hInst =
打破;
案例:
打破;
案例:
打破;
案例:
打破;
}
返回1;
}
void (int nCode)
{
old key hook = (wh _,(),hInst,0);
}
回调(int nCode,,) 。
{
j;
文件* fp
if()
{
j =
fp=fopen("c:\hook\key.txt "," a ");
(fp," %4d ",j);
(FP);
}
返回(,nCode,,);
}
空中心端钩(空中心)
{
(旧钥匙钩);
}
这个动态链接库的源代码.cpp包含了键盘处理函数,设置钩子,退出钩子函数 。键盘敲出来的键作为值存储在c:.txt文件中 。以下是对这份文件的详细解释 。
要使用DLL中包含的函数,您必须导入它 。导入操作通过完成,和都是vc( C++)和bc( C++)支持的扩展关键字 。但是,和关键字不能单独使用,因此必须在它之前添加另一个扩展关键字 。一般格式如下:()其中是存储类标识符 。对于dll,说明符将是和 。此外,为了简化描述导入和导出函数的语句,使用了一个宏名来代替 。在这个程序中,使用了 。如果你把用户的DLL编译成C++程序,希望C程序也可以用,那就需要加一个“C”连接描述 。#定义dll导出 "c" _ _(DLL )以避免破坏标准C++命名 。当然,如果读者是在编译C程序,就不要加“C”了,因为没有必要,编译器不会接受 。使用宏定义,您现在可以用一个简单的语句导出函数,例如:
回调(int nCode,,); void安装挂钩(int nCode); void结束钩(void);
之一个#语句创建了一个数据段,此处命名为 。其实你爱怎么叫都行 。#语句之后的所有初始化变量都进入段 。第二个#语句是数据段的结束标记 。对变量进行特殊的初始化是非常重要的,否则编译器会把它们放在普通的未初始化段中,而不是中 。
但是链接器必须等到有一个段 。我们可以在项目设置(vc6.0)对话框中选择链接选项 。选择时,它位于项目选项字段(在发布和调试配置中)中,并包含以下连接语句:/: Hook data,字母RWS表示该段具有读取、写入和共享属性 。当然,也可以直接使用DLL源代码指定链接器,就像hook DLL . c:#(,"/: hook data,rws ") 。
因为有些dll需要特殊的开始和停止代码 。因此,所有DLL都有一个名为()的函数,该函数在DLL初始化或终止时被调用 。这个函数一般在动态链接库的资源文件中定义 。但是,如果没有定义,编译器将自动提供默认形式 。