美文网首页
Windows Hook

Windows Hook

作者: Tommmmm | 来源:发表于2018-02-22 15:49 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/wrlztftx.html