首页
社区
课程
招聘
[求助]关于HOOK子程的一个疑问,大家都来
发表于: 2012-4-24 12:43 4377

[求助]关于HOOK子程的一个疑问,大家都来

2012-4-24 12:43
4377
全局钩子:我写了一个截取IE下载提示框的HOOK子程,功能是在IE弹出下载提示框前先弹出一个对话框,来确认是否下载,如果点确定则弹出IE的下载框,取消则不下载。问题是,我在点确定后,没有下载框,什么动作都没有,好像消息无法通过CallNextHookEx来传递下去。高手解释为什么,谢谢。

下面是DLL的代码:

LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
        PCWPSTRUCT pCwp=NULL;
        CString strClassName;  // 窗口的标题
        HWND hWnd = NULL;

        if (nCode < 0)
        {
                return CallNextHookEx(g_Hook,nCode,wParam,lParam);
        }

        if (NULL != lParam)
        {
                pCwp = (PCWPSTRUCT) lParam;
                if (WM_CREATE == pCwp -> message)  //HOOK  WM_CREATE 消息
                        {
                                //::GetClassName (pCwp->hwnd,strClassName.GetBufferSetLength(128),128);
                                ::GetWindowTextA(pCwp->hwnd,strClassName.GetBufferSetLength(128),128);
                                if (0==strClassName.CompareNoCase("文件下载"))//看WM_CREATE 消息是否要创建标题为  文件下载  的对话框
                                        {
                                                msgget=MessageBox(NULL,TEXT("您确定要下载该文件吗?"),TEXT("下载确认"),1);
                                                if(msgget==IDOK)
                                                        {
                                                                //MessageBox(NULL,TEXT("if"),TEXT("2"),0);
                                                                return CallNextHookEx(g_Hook,nCode,wParam,lParam);
                                                        }
                                                else
                                                        {
                                                                //MessageBox(NULL,TEXT("else"),TEXT("2"),0);
                                                                return 1;
                                                        }
                                        }
                                else
                                        {
                                                return CallNextHookEx(g_Hook , nCode , wParam , lParam);
                                        }
                        }
                else
                        {
                                return CallNextHookEx(g_Hook , nCode , wParam , lParam);
                        }
        }
        else
        {
                return CallNextHookEx(g_Hook , nCode , wParam , lParam);
        }
}

安装钩子的函数
void SetHook()
{
        HINSTANCE hmodHook = GetModuleHandle ("hook.dll");
        g_Hook=(HHOOK)SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hmodHook,0);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 297
活跃值: (265)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
2
所有的return都改为callnexthookex行不
2012-4-24 13:36
0
雪    币: 511
活跃值: (353)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
3
msdn说不行,其实我也试了,效果一样
2012-4-24 15:47
0
雪    币: 511
活跃值: (353)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
4
上面的问题解决了,我把
::GetWindowTextA(pCwp->hwnd,strClassName.GetBufferSetLength(128),128);
换成
CREATESTRUCT *createStruct=(CREATESTRUCT*)(pCwp->lParam);
strClassName=createStruct->lpszName;
后,消息又传递了。但是,点 取消 按钮,无法阻止消息的传递,郁闷

C/C++ code

#include <afx.h>
#include <windows.h>
#include <cstringt.h>

int msgget=0;

HHOOK g_Hook=NULL;
#pragma data_seg("MySec")
HWND g_hWnd=NULL;
#pragma data_seg()

LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    CWPSTRUCT* pCwp=NULL;
    CString strClassName;  // 窗口的标题
    HWND hWnd = NULL;

    if (nCode < 0)
    {
        return CallNextHookEx(g_Hook,nCode,wParam,lParam);
    }

    if (NULL != lParam)
    {
        pCwp = (CWPSTRUCT*) lParam;
        if (WM_CREATE == pCwp -> message)
            {
                CREATESTRUCT *createStruct=(CREATESTRUCT*)(pCwp->lParam);
                strClassName=createStruct->lpszName;

                if (0==strClassName.CompareNoCase("文件下载"))
                    {
                        msgget=MessageBox(NULL,TEXT("您确定要下载该文件吗?"),TEXT("下载确认"),1);
                        if(msgget==IDOK)
                            {
                                return CallNextHookEx(g_Hook,nCode,wParam,lParam);
                                
                            }
                        else
                            {
                                return 1;//这句不起作用,无法终止消息传递
                            }
                    }
                else
                    {
                        return CallNextHookEx(g_Hook , nCode , wParam , lParam);
                        
                    }
            }
        else
            {
                return CallNextHookEx(g_Hook , nCode , wParam , lParam);
               
            }
    }
    else
    {
        return CallNextHookEx(g_Hook , nCode , wParam , lParam);
        
    }
}

void SetHook(HWND hwnd)
{
    g_hWnd=hwnd;
    HINSTANCE hmodHook = GetModuleHandle ("hook.dll");
    g_Hook=(HHOOK)SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)CallWndProc,hmodHook,0);
}
void UnHook()
{
    UnhookWindowsHookEx(g_Hook);
}
2012-4-24 21:46
0
游客
登录 | 注册 方可回帖
返回
//