Windows Hook

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;       //表示已经处理了该消息  
}

你可能感兴趣的:(Windows Hook)