幽魂国度

 

钩子

HHOOK SetWindowsHookEx(                                    //装载一个钩子         
    int idHook,                                            //描述被装载的钩子的类型,参数见下面
    HOOKPROC lpfn,                               //钩子回调函数的地址,如果 dwThreadId 为 0 那么这个回调函数会在不同的进程中创建,它必须写在在DLL中
    HINSTANCE hMod,                                        //DLL的句柄
    DWORD dwThreadId                                    //描述要钩住的线程ID,如果这个参数为0,则会钩住桌面上的所有线程
);                                                         //如果函数调用成功,返回值是成功开启的钩子句柄,如果失败,返回值为 0
/*
    idHook 相关的参数:
            WH_CALLWNDPROC                :安装一个钩子,监视系统发送给窗口的消息,更多信息如下:
LRESULT CALLBACK CallWndProc(         
                            int nCode,                       //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                            WPARAM wParam,      //描述这个消息是否来自于当前的线程,如果这个消息是来自于当前的线程那么该值为非零,否则该值为零
                            LPARAM lParam           //一个指向 CWPSTRUCT 结构体的指针,更多相关信息如下:
                        );
                                    typedef struct {
                                        LPARAM lParam;                   //消息的扩展信息
                                        WPARAM wParam;                //消息的扩展信息
                                        UINT message;                        //消息
                                        HWND hwnd;                         //接受消息的窗口
                                    } CWPSTRUCT, *PCWPSTRUCT;

            WH_CALLWNDPROCRET            :安装一个钩子,监视系统发送已经处理后给窗口的消息,更多信息如下:
                    LRESULT CALLBACK CallWndRetProc(          
                            int nCode,                      //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                            WPARAM wParam,     //描述这个消息是否来自于当前的线程,如果这个消息是来自于当前的线程那么该值为非零,否则该值为零
                            LPARAM lParam         //一个指向 CWPSTRUCT 结构体的指针,更多相关信息如上:
                        );

            WH_CBT                        :安装一个钩子,临视系统发送给窗口的基本信息(基于计算机培训的"钩子"),更多信息如下:
                    LRESULT CALLBACK CBTProc(         
                        int nCode,                        //描述钩子程序装如何处理消息,如果 nCode 的值小于零 那么钩子程序将跳过这个消息.返回调用 CallNextHookEx 得到的返回值,相关值的意义如下
                        WPARAM wParam,        //相关信息参见返回值
                        LPARAM lParam            //相关信息参见返回值
                    );                                    //返回值为参数一相关的值
                                    //        nCode    的相关值
                                        HCBT_ACTIVATE            :系统正要激活一个窗口
                                        HCBT_CLICKSKIPPED        :系统已经从消息队列中删除了鼠标滚回消息,必须在安装了 WH_JOURNALPLAYBACK 钩子之后才会触发该消息
                                        HCBT_CREATEWND            :一个窗口已经被创建,系统会在发送 WM_CREATE 或 WM_NCCREATE 消息之前调用钩子程序.如果钩子程序
                                                                 的返回值为非零,那么系统装会销毁这个窗口, CreateWindow 函数的返回值会为 NULL,但是 WM_DESTROY
                                                                 消息不会发送给窗口,如果钩子程序的返回值为零,那么窗口会被正常创建,在 HCBT_CREATEWND 被通知
                                                                 的时候,这个窗口就已经被创建了,但是它的大小和位置被有被指定,以及它的父窗口也没有被指定.
                                        HCBT_DESTROYWND            :一个窗口已经被销毁
                                        HCBT_KEYSKIPPED            :系统已经从消息队列中删除了键盘滚回消息,必须在安装了 WH_JOURNALPLAYBACK 钩子之后才会触发该消息
                                        HCBT_MINMAX                :一个窗口已经最小化或最大化了
                                        HCBT_MOVESIZE            :一个窗口已经移动了或改变了大小
                                        HCBT_QS                    :一个窗口已经从系统消息队列中接受了  WM_QUEUESYNC  消息.
                                        HCBT_SETFOCUS            :一个窗口已经被激活
                                        HCBT_SYSCOMMAND            :一个窗口已经接受了系统命令

            WH_DEBUG                    :安装一个钩子,钩住安装钩子的程序(差错"钩子"),更多信息如下:
                    LRESULT CALLBACK DebugProc(          
                        int nCode,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                        WPARAM wParam,                    //描述什么样的钩子被装载了,参数值与 SetWindowsHookEx 函数的 idHook 参数值相同
                        LPARAM lParam                    //一个指向  DEBUGHOOKINFO 结构体的指什,具体信息如下:
                    );
                            typedef struct {
                                DWORD idThread;                                //filter 线程的ID
                                DWORD idThreadInstaller;                    //debugging filter 线程的ID
                                LPARAM lParam;                                //描述跳过此钩子程序要传递给Debug程序的 lParam
                                WPARAM wParam;                                //描述跳过此钩子程序要传递给Debug程序的 wParam
                                int code;                                    //描述跳过此钩子程序要传遵给Debug程序的 nCode
                            } DEBUGHOOKINFO, *PDEBUGHOOKINFO;

            WH_FOREGROUNDIDLE            :安装一个钩子,当一个程序的前端线程改变为低优先级时调用钩子程序,这个钩子在一个任务被降低优先级前工作(前台空闲窗口"钩子"),更多信息如下:
                    DWORD CALLBACK ForegroundIdleProc(
                        int code,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                        DWORD wParam,       //这个参数没有用
                        LONG lParam              //这个参数没有用
                    );

            WH_GETMESSAGE                :安装一个钩子,监视一个消息被寄送到了消息等待队列中(接收消息投递的"钩子"),更多信息如下:
                    LRESULT CALLBACK GetMsgProc(          
                        int code,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                        WPARAM wParam,                    //描述这个消息是否被删除了从消息队列中 值为:    PM_NOREMOVE        :描述这个消息没有从消息队列中删除(应用程序调用了 PeekMessage )        
                                                                                                        PM_REMOVE        :描述这个消息已经从消息队列中删除(应用程序调用了 GetMessage 或 PeekMessage)
                        LPARAM lParam                    //一个指向 MSG 结构体的指针,,具体信息如下:
                    );
                            typedef struct {
                                HWND hwnd;                //接受消息的窗体句柄
                                UINT message;            //描述消息,应用程序通常使用低位 WORD 值,操作系统通常使用高位 WORD 值
                                WPARAM wParam;            //消息的附加消息
                                LPARAM lParam;            //消息的附加消息
                                DWORD time;                //消息的发送时间
                                POINT pt;                //消息发送时的鼠标指针位置
                            } MSG, *PMSG;

            WH_JOURNALPLAYBACK            :安装一个钩子,滚回一个鼠标键盘的消息队列,这个消息队列是由 WH_JOURNALRECORD 钩子创建的,更多信息如下:
                    LRESULT CALLBACK JournalPlaybackProc(
                        int code,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                                          这个参数可能是以下值:          
       HC_GETNEXT        :钩子程序拷贝了当前的鼠标或键盘消息,它是一个 EVENTMSG 结构体,由 lParam 来传递指针
       HC_NOREMOVE        :应用程序调用了 PeekMessage 函数,且调用 PeekMessage 函数之后,消息没有从系统消息队列中被移除
       HC_SKIP            :钩子程序准备复制被 lParam 指向的 EVENTMSG 结构下的鼠标或键盘信息,一旦收到 HC_GETNEXT 钩子程序复制
       HC_SYSMODALOFF    :一个消息框被销毁,钩子程序将继续开始滚回消息
       HC_SYSMODALON    :一个消息框被显示出来,钩子程序将暂停滚回消息,直到这个消息框被销毁,钩子程序才继续开始滚回消息
                        WPARAM wParam,                    //无用的参数
                        LPARAM lParam                    //只有当 nCode 参数的值为 HC_GETNEXT ,它才是一个指向 EVENTMSG 结构体的指针,否则是无用的参数
                    );
                     
            WH_JOURNALRECORD              :安装一个钩子,记录一个鼠标键盘消息队列,更多信息如下:
                    LRESULT CALLBACK JournalRecordProc(          
                        int code,//描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                  HC_SYSMODALOFF    :一个消息框被销毁,钩子程序将继续开始滚回消息
                                  HC_SYSMODALON    :一个消息框被显示出来,钩子程序将暂停滚回消息,直到这个消息框被销毁,钩子程序才继续开始滚回消息
                        WPARAM wParam,//这个参数是无效的
                        LPARAM lParam//一个指向 EVENTMSG 结构体的指针变量
                    );
                        typedef struct {
                            UINT message; //描述消息
                            UINT paramL;  //消息的扩展信息
                            UINT paramH;  //消息的扩展信息
                            DWORD time;  //寄送消息的时间
                            HWND hwnd;  //接受消息的窗口句柄
                        } EVENTMSG, *PEVENTMSG;
            
            WH_KEYBOARD                    :安装一个钩子:监视键盘的消息,更多信息如下:
                    LRESULT CALLBACK KeyboardProc(
                        int code,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                                          这个参数可能是以下值:           
                           HC_ACTION        :wParam 和 lParam 包涵了完整的消息
                           HC_NOREMOVE        :wParam 和 lParam 包涵了完整的消息,且这个键盘消息没有从系统消息队列中删除
                        WPARAM wParam,                    //描述键盘消息的虚拟键信息
                        LPARAM lParam                    //描述键盘消息的扫描码信息
                    );

            WH_KEYBOARD_LL                :安装一个钩子:监视键盘的低级消息(Windows NT/2000/XP),更多信息如下:
                    LRESULT CALLBACK LowLevelKeyboardProc(
                        int nCode,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                         HC_ACTION        :wParam 和 lParam 包涵了完整的消息
                        WPARAM wParam,               //描述了键盘的消息值:WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或 WM_SYSKEYUP.
                        LPARAM lParam                    //一个指向 KBDLLHOOKSTRUCT 结构体的指针变量,更多信息如下:
                    );
                            typedef struct { 
                                DWORD vkCode;                  //键盘消息的虚拟键信息,值的范围从1至254
                                DWORD scanCode;               //键盘的扫描码信息
                                DWORD flags;                        //键盘的扩展信息
                                DWORD time;                        //消息的产生时间,可以用    GetMessageTime 函数取得
                                ULONG_PTR dwExtraInfo;    //消息的扩展信息
                            } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;

            WH_MOUSE                    :安装一个钩子:监视键盘的消息,更多信息如下:
                    LRESULT CALLBACK MouseProc(
                        int nCode,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                                          这个参数可能是以下值:        
                                            HC_ACTION        :wParam 和 lParam 包涵了完整的消息
                                            HC_NOREMOVE        :wParam 和 lParam 包涵了完整的消息,且这个鼠标消息没有从系统消息队列中删除
                        WPARAM wParam,                    //描述了鼠标的消息值
                        LPARAM lParam                    //一个指向 MOUSEHOOKSTRUCT 结构体的指针变量,更多信息如下:
                    );
                            typedef struct {
                                POINT pt;                //发送鼠标消息时候的鼠标坐标
                                HWND hwnd;                //接收鼠标消息的窗口句柄
                                UINT wHitTestCode;        //测试码
                                ULONG_PTR dwExtraInfo;    //鼠标消息的扩展信息
                            } MOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;

            WH_MOUSE_LL                    :安装一个钩子:监视鼠标的低级消息(Windows NT/2000/XP),更多信息如下:
                    LRESULT CALLBACK LowLevelMouseProc(
                        int nCode,                         //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                                        这个参数可能是以下值:            HC_ACTION        :wParam 和 lParam 包涵了完整的消息
                        WPARAM wParam,                 //描术了鼠标的消息值: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, 或 WM_RBUTTONUP.
                        LPARAM lParam                      //一个指向 MSLLHOOKSTRUCT 的指针变量,具体信息如下:
                    );
                            typedef struct {
                                POINT pt;                         //发送鼠标消息时候的鼠标坐标
                                DWORD mouseData;        //如果这个消息是 WM_MOUSEWHEEL 则高位为滚轮的滚动数目,低位保留.如果这个消息是  WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK,
                                                          WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, 或 WM_NCXBUTTONDBLCLK.则高位描述的是X按钮是按下还是释放,低位保留
                                DWORD flags;                         //描述消息的注入事件
                                DWORD time;                         //描述寄送消息的时候
                                ULONG_PTR dwExtraInfo;    //描述消息的扩展信息
                            } MSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;

            WH_MSGFILTER                :安装一个钩子:监视一些如同输入框,消息框,菜单,滚动条的事件(对话框、消息框、菜单或滚动条输入消息"钩子"),更多信息如下:
                    LRESULT CALLBACK MessageProc(
                        int code,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                                        这个参数可能是以下值:            MSGF_DDEMGR        :输入框
                                                                                        MSGF_DIALOGBOX    :消息框
                                                                                        MSGF_MENU        :菜单
                                                                                        MSGF_SCROLLBAR    :滚动条
                        WPARAM wParam,                    //保留值
                        LPARAM lParam                        //一个指向 MSG 的指针变量,更多信息参见上面;
                    );

            WH_SHELL                    :安装一个钩子:监视对程序的 Shell 操作(外壳"钩子"),更多信息如下:
                    LRESULT CALLBACK ShellProc(  
                        int nCode,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                                        这个参数可能是以下值:            
                                                        HSHELL_ACCESSIBILITYSTATE            :程序的访问权被改变 (Windows 2000/XP)
                                                        HSHELL_ACTIVATESHELLWINDOW            :Shell 操作将激活程序的主窗口
                                                        HSHELL_APPCOMMAND                    :用户完成了输入一个指令(例如按下了一个关键的按钮或键)而且应用程序没有处理被产生的
                                                                                                             WM_APPCOMMAND 消息.WM_APPCOMMAND值参见下面
                                                                                                                    wParam:按下或放开按钮
                                                                                                                    lParam:
                                                           APPCOMMAND_BASS_BOOST        :低音开关
                                                           APPCOMMAND_BASS_DOWN        :减少低音
                                                           APPCOMMAND_BASS_UP               :增加低音
                                                           APPCOMMAND_BROWSER_BACKWARD    :浏览器-向前
                                                           APPCOMMAND_BROWSER_FAVORITES:浏览器-收藏夹
                                                           APPCOMMAND_BROWSER_FORWARD    :浏览器-向后
                                                           APPCOMMAND_BROWSER_HOME        :浏览器-主页
                                                           APPCOMMAND_BROWSER_REFRESH    :浏览器-刷新
                                                           APPCOMMAND_BROWSER_SEARCH    :浏览器-搜索
                                                           APPCOMMAND_BROWSER_STOP        :浏览器-停止下载
                                                           APPCOMMAND_CLOSE            :关闭窗口(不是程序)
                                                           APPCOMMAND_COPY                :复制已选择
                                                           APPCOMMAND_CORRECTION_LIST    :当一个不正确的字符输入时,退出
                                                           APPCOMMAND_CUT                :剪切已选择
                                      APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE   :输入和控制状态的互相改变
                                                           APPCOMMAND_FIND                :打开查找对话框
                                                           APPCOMMAND_FORWARD_MAIL        :向前浏览邮件
                                                           APPCOMMAND_HELP                :打开帮助对话框
                                                           APPCOMMAND_LAUNCH_APP1        :打开应用程序1
                                                           APPCOMMAND_LAUNCH_APP2        :打开应用程序2
                                                           APPCOMMAND_LAUNCH_MAIL        :打开邮件
                                                           APPCOMMAND_MEDIA_CHANNEL_DOWN  :向下翻多媒体的频道(Windows XP SP1)
                                                           APPCOMMAND_MEDIA_CHANNEL_UP    :向上翻多媒体的频道(Windows XP SP1)
                                                           APPCOMMAND_MEDIA_FASTFORWARD:回滚多媒体           (Windows XP SP1)
                                                           APPCOMMAND_MEDIA_NEXTTRACK    :多媒体播放下一个文件
                                                           APPCOMMAND_MEDIA_PAUSE        :多媒体暂停
                                                           APPCOMMAND_MEDIA_PLAY        :多媒体播放
                                                           APPCOMMAND_MEDIA_PLAY_PAUSE    :多媒体暂停/播放
                                                           APPCOMMAND_MEDIA_RECORD        :多媒体开始记录
                                                           APPCOMMAND_MEDIA_REWIND        :回滚(???)
                                                           APPCOMMAND_MEDIA_SELECT        :进入多媒体选择状态
                                                           APPCOMMAND_MEDIA_STOP        :多媒体停止
                                                           APPCOMMAND_MIC_ON_OFF_TOGGLE:开关麦克风
                                                           APPCOMMAND_MICROPHONE_VOLUME_DOWN 麦克风音量减小
                                                           APPCOMMAND_MICROPHONE_VOLUME_MUTE  :关闭麦克风
                                                           APPCOMMAND_MICROPHONE_VOLUME_UP :麦克风音量加大
                                                           APPCOMMAND_NEW                :创建一个新窗口
                                                           APPCOMMAND_OPEN                :打开一个窗口
                                                           APPCOMMAND_PASTE            :粘贴
                                                           APPCOMMAND_PRINT            :打印
                                                           APPCOMMAND_REDO                :重复最后的动作
                                                           APPCOMMAND_REPLY_TO_MAIL    :回复一个邮件信息
                                                           APPCOMMAND_SAVE                :保存当前的文档
                                                           APPCOMMAND_SEND_MAIL        :发送一个邮件
                                                           APPCOMMAND_SPELL_CHECK        :开始Spell检查
                                                           APPCOMMAND_TREBLE_DOWN        :减小高音
                                                           APPCOMMAND_TREBLE_UP        :增大高音
                                                           APPCOMMAND_UNDO                :恢复最后的操作
                                                           APPCOMMAND_VOLUME_DOWN        :增大音量
                                                           APPCOMMAND_VOLUME_MUTE        :关闭音
                                                           APPCOMMAND_VOLUME_UP        :减小音量
                                                           FAPPCOMMAND_KEY                :用户按下了一个键
                                                           FAPPCOMMAND_MOUSE            :用户按下了一个鼠标按钮
                                                           FAPPCOMMAND_OEM                :未经确认的事件,可能是鼠标事件或是键盘事件
                                                           MK_CONTROL                    :Ctrl键按下了
                                                           MK_LBUTTON                    :鼠标左键按下了
                                                           MK_MBUTTON                    :鼠标中键按下了
                                                           MK_RBUTTON                    :鼠标右键按下了
                                                           MK_SHIFT                    :Shift键按下了
                                                           MK_XBUTTON1                    :第一个X按钮按下了
                                                           MK_XBUTTON2                    :第二个X按钮按下了
                                                                        HSHELL_GETMINRECT        :一个窗口取大化或最小化时系统需要它最小化后的窗口矩形
                                                                        HSHELL_LANGUAGE            :键盘语言改变
                                                                        HSHELL_REDRAW            :任务栏上的该窗口项重画
                                                                        HSHELL_TASKMAN            :用户选择了任务栏中的一项
                                                                        HSHELL_WINDOWACTIVATED    :最前端的窗口改变了Z顺序
                                                                        HSHELL_WINDOWCREATED    :一个最前端的窗口被创建,在调用钩子函数的时候,该窗口已经被创建
                                                                        HSHELL_WINDOWDESTROYED    :一个最前端的窗口被销毁,在调用钩子函数的时候,该窗口已经被销毁
                                                                        HSHELL_WINDOWREPLACED    :一个最前端的窗口被改变位置,在调用钩子函数的时候,该窗口已经被改变位置
                        WPARAM wParam,                    //该参数的值随 nCode 参数的值改变而赋有不同的意义
                                                                    nCode                        |值
                                                                    HSHELL_ACCESSIBILITYSTATE    |ACCESS_FILTERKEYS, ACCESS_MOUSEKEYS,或 ACCESS_STICKYKEYS.
                                                                    HSHELL_APPCOMMAND            |在上面已列出来了
                                                                    HSHELL_GETMINRECT            |窗口句柄
                                                                    HSHELL_LANGUAGE                |窗口句柄
                                                                    HSHELL_REDRAW                |窗口句柄
                                                                    HSHELL_WINDOWACTIVATED        |窗口句柄
                                                                    HSHELL_WINDOWCREATED        |窗口句柄
                                                                    HSHELL_WINDOWDESTROYED        |窗口句柄
                                                                    HSHELL_WINDOWREPLACED        |窗口句柄
                        LPARAM lParam                    //该参数的值随 nCode 参数的值改变而赋有不同的意义
                                                                    nCode                        |值
                                                                    HSHELL_APPCOMMAND            |
                                                                    HSHELL_GETMINRECT            |一个指向 RECT 的结构体变量
                                                                    HSHELL_LANGUAGE                |键盘语言的句柄
                                                                    HSHELL_REDRAW                |TRUE:重画,FALSE:别的方式
                                                                    HSHELL_WINDOWACTIVATED        |TRUE:全屏,FALSE:别的方式
                                                                    HSHELL_WINDOWREPLACED        |新的窗口句柄
                    );                                    //返回值:如果正常调用,返回值为:0 如果 nCode 值为 HSHELL_APPCOMMAND 且Shell值
                                                            为 WM_COMMAND 则返回值为非零

            WH_SYSMSGFILTER                    :安装一个钩子:监视一些如同输入框,消息框,菜单,滚动条的系统事件(系统消息"钩子"),更多信息如下:
                    LRESULT CALLBACK SysMsgProc(
                        int code,                        //描述钩子程序是否一定要处理这个消息 如果 nCode == HC_ACTION,那么钩子程序一定要处理这个消息,如果 nCode 的值小于零,则一定要跳过这个消息
                                                        这个参数可能是以下值:            MSGF_DDEMGR        :输入框
                                                                                        MSGF_DIALOGBOX    :消息框
                                                                                        MSGF_MENU        :菜单
                                                                                        MSGF_SCROLLBAR    :滚动条
                        WPARAM wParam,                    //保留值
                        LPARAM lParam                    //一个指向 MSG 的指针变量,更多信息参见上面;
                    );
*/

LRESULT CallNextHookEx(                                    //调用下一个Hook
    HHOOK hhk,                                            //Hook句柄
    int nCode,                                            //照Hook函数的 nCode 函数输入,具体见上
    WPARAM wParam,                                        //照Hook函数的 wParam 函数输入,具体见上
    LPARAM lParam                                        //照Hook函数的 lParam 函数输入,具体见上
);                                                        //

BOOL UnhookWindowsHookEx(                                //卸载掉钩子
    HHOOK hhk                                            //Hook句柄
);


//////////////////////////////////////////////////////////////////////////////////
钩子类型
         每一种类型的Hook可以使应用程序能够监视不同类型的系统消息处理机制。下面描述所有可以利用的Hook类型。
1、WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks
WH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。
WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。
CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。
2、WH_CBT Hook
在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:
1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;
2. 完成系统指令;
3. 来自系统消息队列中的移动鼠标,键盘事件;
4. 设置输入焦点事件;
5. 同步系统消息队列事件。
Hook子程的返回值确定系统是否允许或者防止这些操作中的一个。
3、WH_DEBUG Hook
在系统调用系统中与其他Hook关联的Hook子程之前,系统会调用WH_DEBUG Hook子程。你可以使用这个Hook来决定是否允许系统调用与其他Hook关联的Hook子程。
4、WH_FOREGROUNDIDLE Hook
当应用程序的前台线程处于空闲状态时,可以使用WH_FOREGROUNDIDLE Hook执行低优先级的任务。当应用程序的前台线程大概要变成空闲状态时,系统就会调用WH_FOREGROUNDIDLE Hook子程。
5、WH_GETMESSAGE Hook
应用程序使用WH_GETMESSAGE Hook来监视从GetMessage or PeekMessage函数返回的消息。你可以使用WH_GETMESSAGE Hook去监视鼠标和键盘输入,以及其他发送到消息队列中的消息。
6、WH_JOURNALPLAYBACK Hook
WH_JOURNALPLAYBACK Hook使应用程序可以插入消息到系统消息队列。可以使用这个Hook回放通过使用WH_JOURNALRECORD Hook记录下来的连续的鼠标和键盘事件。只要WH_JOURNALPLAYBACK Hook已经安装,正常的鼠标和键盘事件就是无效的。
WH_JOURNALPLAYBACK Hook是全局Hook,它不能象线程特定Hook一样使用。
WH_JOURNALPLAYBACK Hook返回超时值,这个值告诉系统在处理来自回放Hook当前消息之前需要等待多长时间(毫秒)。这就使Hook可以控制实时事件的回放。
WH_JOURNALPLAYBACK是system-wide local hooks,它??不??射到任何行程位址空駣??
7、WH_JOURNALRECORD Hook
WH_JOURNALRECORD Hook用来监视和记录输入事件。典型的,可以使用这个Hook记录连续的鼠标和键盘事件,然后通过使用WH_JOURNALPLAYBACK Hook来回放。
WH_JOURNALRECORD Hook是全局Hook,它不能象线程特定Hook一样使用。
WH_JOURNALRECORD是system-wide local hooks,它??不??射到任何行程位址空駣??
8、WH_KEYBOARD Hook
在应用程序中,WH_KEYBOARD Hook用来监视WM_KEYDOWN and WM_KEYUP消息,这些消息通过GetMessage or PeekMessage function返回。可以使用这个Hook来监视输入到消息队列中的键盘消息。
9、WH_KEYBOARD_LL Hook
WH_KEYBOARD_LL Hook监视输入到线程消息队列中的键盘消息。
10、WH_MOUSE Hook
WH_MOUSE Hook监视从GetMessage 或者 PeekMessage 函数返回的鼠标消息。使用这个Hook监视输入到消息队列中的鼠标消息。
11、WH_MOUSE_LL Hook
WH_MOUSE_LL Hook监视输入到线程消息队列中的鼠标消息。
12、WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks
WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以监视菜单,滚动条,消息框,对话框消息并且发现用户使用ALT+TAB or ALT+ESC 组合键切换窗口。WH_MSGFILTER Hook只能监视传递到菜单,滚动条,消息框的消息,以及传递到通过安装了Hook子程的应用程序建立的对话框的消息。WH_SYSMSGFILTER Hook监视所有应用程序消息。
WH_MSGFILTER 和 WH_SYSMSGFILTER Hooks使我们可以在模式循环期间过滤消息,这等价于在主消息循环中过滤消息。
通过调用CallMsgFilter function可以直接的调用WH_MSGFILTER Hook。通过使用这个函数,应用程序能够在模式循环期间使用相同的代码去过滤消息,如同在主消息循环里一样。
13、WH_SHELL Hook
外壳应用程序可以使用WH_SHELL Hook去接收重要的通知。当外壳应用程序是激活的并且当顶层窗口建立或者销毁时,系统调用WH_SHELL Hook子程。
WH_SHELL 共有5钟情?r:
1. 只要有个top-level、unowned 窗口被产生、起作用、或是被摧毁;
2. 当Taskbar需要重画某个按钮;
3. 当系统需要显示关于Taskbar的一个程序的最小化形式;
4. 当目前的键盘布局状态改变;
5. 当使用者按Ctrl+Esc去执行Task Manager(或相同级别的程序)。
       按照惯例,外壳应用程序都不接收WH_SHELL消息。所以,在应用程序能够接收WH_SHELL消息之前,应用程序必须调用SystemParametersInfo function注册它自己。

posted on 2009-11-28 16:01 阅读(1332) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜