钩子详解

来源:互联网 发布:管家婆的数据在哪里面 编辑:程序博客网 时间:2024/06/02 10:28

HHOOK SetWindowsHookEx(                                    //装载一个钩子         

    int idHook,                                            //描述被装载的钩子的类型,参数见下面

    HOOKPROC lpfn,                                        //钩子回调函数的地址,如果 dwThreadId 为 0 那么这个回调函数会在不同的进程中创建,它必须写在在DLL中

    HINSTANCE hMod,                                        //DLL的句柄

    DWORD dwThreadId                                    //描述要钩住的线程ID,如果这个参数为0,则会钩住桌面上的所有线程

);                                                         //如果函数调用成功,返回值是成功开启的钩子句柄,如果失败,返回值为 0 

/*

    idHook 相关的参数:<!--more-->

            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注册它自己。