• 用HOOK函数自动关闭IE广告窗口


     1、弹出式广告框也是IE浏览窗口,一般来说,它是一个无菜单、无工具栏窗口。所以可以在桌面上打开一个窗口时,首先判断该窗口类型是否是“IEFrame”,接着判断IEFrame的子窗口类型“WorkerW”的属性是否是不可见(这是一般弹出式广告窗口的特征),这样就可以向该窗口发出关闭的消息,以上步骤一般能自动关闭大部分弹出广告框。

      2、通过WINDOWS编程中的钩子(HOOK)函数解决截获在桌面上打开窗口的消息。钩子函数的基本原理就是对WINDOWS系统的某些动作注册,当发生这些事件时首先调用预先设置的回调函数,回调函数处理后,再由原来的函数处理。这里回调函数的作用正是实现1中叙述的功能。因为这里实现的钩子函数是监视其它进程窗口产生的消息,所以必须用动态链接库实现。

      主要代码如下:

      在动态链接库中,实现钩子回调函数。

      

    LRESULT CALLBACK CallWndProc(
    int nCode, // hook code
    WPARAM wParam, // current-process flag
    LPARAM lParam // address of structure with message data
    )
    {
    CWPSTRUCT *pCwp = NULL;
    CString strClassName;
    HWND hWnd = NULL;
    unsigned long ulStyle = 0;
    BOOL bIsClosed = FALSE;
    if (nCode < 0)
    {
    return CallNextHookEx(gHook, nCode, wParam, lParam);
    }
    if (NULL != lParam)
    {
    pCwp = (CWPSTRUCT *)lParam;
    if (WM_SHOWWINDOW == pCwp->message)
    {
    ::GetClassName(pCwp->hwnd, strClassName.GetBufferSetLength(128), 128);
    //IE窗口的类型为IEFrame
    if (0 == strClassName.CompareNoCase("IEFrame"))
    {
    hWnd = ::GetWindow(pCwp->hwnd, GW_CHILD);
    if (NULL == hWnd)
    {
    bIsClosed = TRUE;
    }
    while (NULL != hWnd)
    {
    ::GetClassName(hWnd, strClassName.GetBufferSetLength(127), 127);
    //IEFrame的子窗口包含窗口类型WorkerW
    if (0 == strClassName.CompareNoCase("WorkerW"))
    {
    //若WorkerW不可见,则一般是广告弹出窗口
    if (0 == (::GetWindowLong(hWnd, GWL_STYLE) & WS_VISIBLE))
    {
    bIsClosed = TRUE;
    break;
    }
    break;
    }
    else
    {
    bIsClosed = TRUE;
    }
    hWnd = ::GetWindow(hWnd, GW_HWNDNEXT);
    }
    //若是IE广告弹出窗口,则关闭
    if (TRUE == bIsClosed)
    {
    ::PostMessage(pCwp->hwnd, WM_CLOSE, 0, 0);
    }
    }
    }
    }
    return CallNextHookEx(gHook, nCode, wParam, lParam);
    }
    在主程序中,调用DLL中的CallWndProc。
    //获得动态链接库句柄
    HINSTANCE hmodHook = GetModuleHandle("CloseWndDll.dll");
    if (NULL == hmodHook)
    {
    return TRUE;
    }
    //设置钩子函数
    if (NULL == gHook)
    {
    gHook = SetWindowsHookEx(WH_CALLWNDPROC,
    (HOOKPROC)GetProcAddress(hmodHook, "CallWndProc"), hmodHook, 0);
    }
    主程序退出时,注意调用钩子卸载函数。
    //卸载钩子函数
    if (NULL != gHook)
    {
    UnhookWindowsHookEx(gHook);
    gHook = NULL;
    }
  • 相关阅读:
    Java多线程之 对同一个值操作
    Java 之 应用多线程计算1+2+...+100之多种方法比较(二)
    Java 之 应用多线程计算1+2+...+100之多种方法比较(一)
    SQL语句优化
    第六章:shiro Realm相关对象
    第五章:shiro密码加密
    第四章:shiro的INI配置
    第三章:shiro授权认证
    第二章:shiro身份验证
    第一章:Shiro简介
  • 原文地址:https://www.cnblogs.com/lzjsky/p/2184796.html
Copyright © 2020-2023  润新知