zoukankan      html  css  js  c++  java
  • 用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;
    }
  • 相关阅读:
    mysql把一个表的字段update成另一个表的字段根据id
    1月房地产企业销售TOP100出炉 万科重回第一
    别拿学历说事,这些天王中学没毕业,最低的是成龙
    马云:未来经济形势很艰难,需要企业家挺身而出
    私有云与公有云区别,公有云不可能统一天下
    除了首付,购房预算还须有这7项才能买到房!
    房产交易中的10个非典型问题 你肯定不懂!
    几个常用快速无损压缩算法性能比较
    ValueTask
    Mobaxterm
  • 原文地址:https://www.cnblogs.com/lzjsky/p/2184796.html
Copyright © 2011-2022 走看看