什么是HOOK编程?
这得从Windows消息机制说起:当在应用程序窗口内点击鼠标左键时,操作系统会感知这一事件,然后把消息放到应用程序的消息响应队列中,应用程序通过GetMessage读取消息,然后通过DispatchMessage将消息调度给操作系统,操作系统会调用在设计窗口类时指定的应用程序窗口过程函数对消息进行处理。
假如我们希望对某个特殊的消息进行屏蔽,比如希望这个应用程序不响应回车和空格消息,就需要截获所有消息,然后进行判断,如果是这两种消息,则将它们屏蔽掉。为了实现这个功能,我们可以安装一个HOOK过程,在此过程中检查,再决定是否放行该消息。
其中g_hMouse是用来存放钩子过程句柄的全局变量函数,而MouseProc则是与鼠标消息相对应的钩子函数,如果这个函数返回非0值,则表示以对其进行了处理,系统将不会把这消息传递给窗口过程函数了。我们这里只是简单地让其返回1:
这得从Windows消息机制说起:当在应用程序窗口内点击鼠标左键时,操作系统会感知这一事件,然后把消息放到应用程序的消息响应队列中,应用程序通过GetMessage读取消息,然后通过DispatchMessage将消息调度给操作系统,操作系统会调用在设计窗口类时指定的应用程序窗口过程函数对消息进行处理。
假如我们希望对某个特殊的消息进行屏蔽,比如希望这个应用程序不响应回车和空格消息,就需要截获所有消息,然后进行判断,如果是这两种消息,则将它们屏蔽掉。为了实现这个功能,我们可以安装一个HOOK过程,在此过程中检查,再决定是否放行该消息。
我们先看代码。在对话框应用程序的OnInitDialog中设置一个钩子过程:
g_hMouse = SetWindowsHookEx(WH_MOUSE, //截获鼠标消息
MouseProc, //钩子函数
NULL, //指定的线程
GetCurrentThreadId()) //当前线程
其中g_hMouse是用来存放钩子过程句柄的全局变量函数,而MouseProc则是与鼠标消息相对应的钩子函数,如果这个函数返回非0值,则表示以对其进行了处理,系统将不会把这消息传递给窗口过程函数了。我们这里只是简单地让其返回1:
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return 1;
}
我们运行一下程序,发现当鼠