刚开始学习写钩子程序时只知道钩子的一些基本概念,不知道怎么用程序实现,网上的一些资料有的只浅显的讲了一下首先用SetWindowsHookEx安装钩子,然后再定义回调函数,将函数名传给SetWindowsHookEx作参数,还是未讲到具体的编程细节;还有的则长篇大论,又是将钩子封装成一个类什么的,又或是用MFC建立一个对话框工程,然后告诉读者,在这个头文件里加点什么,又在OnInitDialog函数里加点什么,搞得人是一头雾水,给人的感觉就是写一个钩子程序相当复杂。但其实,一个最简单的钩子函数,只需要短短的10来行代码就能实现。其源代码如下:
===============================================
//main.cpp
#include <windows.h>
#include <stdio.h>
#define_WIN32_WINNT0x0500//确保SetWindowsHookEx的第一个参数可用WH_KEYBOARD_LL
//或自已定义: “#defineWH_KEYBOARD_LL 13”
HHOOKMyHook;//接收由SetWindowsHookEx返回的旧的钩子
//回调函数声明,为了尽早见到亲切的主函数,将回调函数的定义写在最后面
int CALLBACK KeyboardProc(int code, WPARAMwParam, LPARAM lParam);
//主函数
int main()
{
//安装钩子
MyHook =SetWindowsHookEx( WH_KEYBOARD_LL,
(HOOKPROC)&KeyboardProc,//回调函数地址
GetModuleHandle(NULL),
NULL);
MSGmsg;
while(GetMessage (&msg, NULL, 0,0))//消息循环
{
TranslateMessage (&msg);
DispatchMessage (&msg);
};
UnhookWindowsHookEx(MyHook);
return0;
}
//回调函数,用于处理截获的按键消息
int CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAMlParam)
{
printf("%c",wParam);//输出按键信息,注意这里按下和弹起都会输出
returnCallNextHookEx(MyHook,code,wParam,lParam);//将消息还给钩子链,不要影响别人
}
==============================================
如果SetWindowsHookEx的第一个参数为WH_KEYBOARD,则只能截获本进程的消息;而如果为WH_KEYBOARD_LL,可截获所有按键消息,但这时消息参数lParam总是为1244872,而wParam参数总在按下按键时为256,弹起时为257,不知道为什么,等有时间再研究,同时敬请高手解答。