Hook
关于Hook
1.1什么是Hook
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
1.2Hook的目的
在函数执行前,先执行自己的挂钩函数。达到监控函数调用,改变函数功能的目的。
1.3什么是API
(Application Programming Interface)应用程序编程接口,把某些功能封装好,方便其他人调用。
1.4CALLBACK回调函数
凡是由你设计却由windows系统呼叫的函数,统称为callback函数。
1、回调函数必须有关键词 CALLBACK
2、回调函数本身必须是全局函数或者静态函数,不可定义为某个特定的类的成员函数
3、回调函数并不由开发者直接调用执行(只是使用系统接口API函数作为起点)
4、回调函数通常作为参数传递给系统API,由该API来调用
下面是是一个小程序,大概的功能就是实现在所在进程内的鼠标消息和键盘消息的截获,一旦点击了“LockMouse”那么就在目标窗口截获了所以鼠标的消息,这里实现的是屏蔽鼠标消息,只能通过按回车键恢复鼠标功能。若是点击了“LockKeyBoard”按钮,那么只能在编辑框输入0或者1,但是在没有点击的情况下是正常的编辑框。这点可是比窗口子类化更加简单。
#include "Windows.h"
#include "tchar.h"
#include "resource.h"
HINSTANCE g_hInstance ;
static HHOOK hHook = NULL;
INT_PTR CALLBACK ProcWinMain(HWND hWnd, UINT Msg, WPARAM wParam ,LPARAM lParam);
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK BoardProc(int nCode, WPARAM wParam,LPARAM lParam);
/*
LRESULT :WIN32环境下Windows进程或者回调函数的返回值
在32位操作系统里,一个int是4个字节。64位操作系统上,一个int是8个字节。
用INT_PTR代替int理论上可以让代码具有更好的移植性
*/
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
static TCHAR DlgName[] = _T("InnerHook");
g_hInstance = hInstance ;
DialogBoxParam(hInstance,DlgName,NULL,( DLGPROC)ProcWinMain,NULL);
return 0;
}
INT_PTR CALLBACK ProcWinMain( HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
)
{
static TCHAR unLockStr[] = _T("Unlocking");
static TCHAR LockStr[] = _T("Locking");
static BOOL isLock = FALSE;
static BOOL isLock2 = FALSE;
static HHOOK hHook2 = NULL;
switch(Msg)
{
case WM_INITDIALOG:
{
SetFocus(GetDlgItem(hWnd,IDC_EDITTEXT));
}
break;
case WM_CLOSE:
EndDialog(hWnd,NULL);
break;
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_BTNHOOKBOARD :
{
if(isLock == FALSE)
{
hHook = SetWindowsHookEx(WH_KEYBOARD,BoardProc,NULL,GetCurrentThreadId());
SetDlgItemText(hWnd,ID_BTNHOOKBOARD,LockStr);
isLock = TRUE;
}
else
{
SetDlgItemText(hWnd,ID_BTNHOOKBOARD,unLockStr);
isLock = FALSE;
UnhookWindowsHookEx(hHook);
}
}
break;
case ID_BTNHOOKMOUSE :
{
if(isLock2 == FALSE)
{
hHook2 = SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
SetDlgItemText(hWnd,ID_BTNHOOKMOUSE,LockStr);
isLock2 = TRUE;
}
else
{
SetDlgItemText(hWnd,ID_BTNHOOKMOUSE,unLockStr);
isLock2 = FALSE;
UnhookWindowsHookEx(hHook2);
}
}
break;
}
}
break;
default:
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam,LPARAM lParam)
{
return 1; //返回非0值,表示处理了该消息
}
LRESULT CALLBACK BoardProc(int nCode, WPARAM wParam,LPARAM lParam)
{
if (wParam == VK_RETURN || wParam == '1' || wParam == '0')
{
return CallNextHookEx(hHook,nCode,wParam,lParam); //表示不处理该消息,交还给Windows自己处理
}
else
return 1; //表示已经处理了该消息
}
网友评论