您的位置:首页 > 职场人生

VC中局部钩子

2010-03-08 21:50 375 查看
我发现我写的都是超短的代码来着.....
闲话少说,今天说一下VC中局部钩子的实现.
先看看MSDN中对于设置钩子这个函数的说明
HHOOK SetWindowsHookEx(
int idHook, // type of hook to install 即钩子类型
HOOKPROC lpfn, // address of hook procedure  指向钩子的指针,即钩子处理过程
HINSTANCE hMod, // handle to application instance 包含lpfn指向dll的句柄,如钩子只与当前线程有关,则此参数设为Null
DWORD dwThreadId // identity of thread to install hook for  与钩子相关的线程的标识符,如果为0,则与所有线程相关
);
//此函数的返回值:如果成功,返回的是一个钩子过程句柄,如果失败的话,则是返回Null;
先建一个工程[VC6.0]下.建基于对话框的工程后.找到自动生成的主对话框的类,
为了简单,我们就把钩子设置在OnInitDialog()函数.
先找到OnInitDialog()函数.
定义几个全局变量先.
放哪里都行,为了可读性好,最好放OnInitDialog()上面
view plaincopy to clipboardprint?
HHOOK h_Mouse=NULL; //用于保存安装的鼠标钩子的句柄
HHOOK h_Keyboard=NULL; //用于保存安装的键盘钩子的句柄
HWND h_Wnd=NULL; //窗口句柄,用于接收关闭消息
HHOOK h_Mouse=NULL; //用于保存安装的鼠标钩子的句柄
HHOOK h_Keyboard=NULL; //用于保存安装的键盘钩子的句柄
HWND h_Wnd=NULL; //窗口句柄,用于接收关闭消息

然后在OnInitiDialog()里添加如下代码:
view plaincopy to clipboardprint?
// TODO: Add extra initialization h ere

//关于SetWindowsHookEx()函数的各个参数的意义,可以自己查下MSDN,在这里我简单说下本函数的意义
//WH_MOUSE:设置鼠标钩子 WH_KEYBOARD:设置键盘钩子
//MouseProc:实现钩子过程
//NULL:与当前线程相关
//GetCurrentThreadId()取当前线程
h_Mouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
h_Keyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
h_Wnd=m_hWnd;
// TODO: Add extra initialization h ere
//关于SetWindowsHookEx()函数的各个参数的意义,可以自己查下MSDN,在这里我简单说下本函数的意义
//WH_MOUSE:设置鼠标钩子 WH_KEYBOARD:设置键盘钩子
//MouseProc:实现钩子过程
//NULL:与当前线程相关
//GetCurrentThreadId()取当前线程
h_Mouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
h_Keyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
h_Wnd=m_hWnd;
再在OnInitDialog()函数上面实现键盘和鼠标钩子过程
view plaincopy to clipboardprint?
//定义鼠标钩子过程
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
//在此写处理此消息的代码
//返回非0值,表示我们已处理此鼠标消息了
return 1;
}
//定义键盘钩子过程
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
//设置一个按键来解除钩子,此处用Esc键
if(wParam==VK_ESCAPE)
{
//调用下一个钩子
//return CallNextHookEx(h_Keyboard,code,wParam,lParam);
//给主窗口发送一个系统消息,关闭进程
//全局API函数
::SendMessage(h_Wnd,WM_CLOSE,0,0);
//解除钩子, 参数为钩子句柄
UnhookWindowsHookEx(h_Keyboard);
UnhookWindowsHookEx(h_Mouse);
}
//返回非0值,表示我们已处理此键盘消息了
return 1;
}
//定义鼠标钩子过程
LRESULT CALLBACK MouseProc(
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
)
{
//在此写处理此消息的代码
//返回非0值,表示我们已处理此鼠标消息了
return 1;
}
//定义键盘钩子过程
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
//设置一个按键来解除钩子,此处用Esc键
if(wParam==VK_ESCAPE)
{
//调用下一个钩子
//return CallNextHookEx(h_Keyboard,code,wParam,lParam);
//给主窗口发送一个系统消息,关闭进程
//全局API函数
::SendMessage(h_Wnd,WM_CLOSE,0,0);
//解除钩子, 参数为钩子句柄
UnhookWindowsHookEx(h_Keyboard);
UnhookWindowsHookEx(h_Mouse);
}
//返回非0值,表示我们已处理此键盘消息了
return 1;
}
就这样我们的钩子就完成了,在代码中每行的注释都写得挺清楚了,我就不在此说明了.
这是局部钩子,大家可以学下全局的.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息