65.9K
CodeProject 正在变化。 阅读更多。
Home

通用自动填充

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.91/5 (10投票s)

2006 年 4 月 15 日

CPOL

4分钟阅读

viewsIcon

137014

downloadIcon

2502

通用自动填充可以使用一些基于PC的存储数据自动填充基于html的表单。它是一款非常类似于Google自动填充的应用程序。

Generic AutoFill Sample Image

引言

自动填充是以ATL实现的一种浏览器辅助对象(BHO)。BHO是一个DLL,它会附加到每个新的Internet Explorer实例。在BHO中,你可以拦截Internet Explorer事件,并访问浏览器窗口和文档对象模型(DOM)。这为你提供了极大的灵活性,可以修改Internet Explorer的行为,以及添加一些额外的功能,将你的实用程序用作IE插件。

与持续扫描打开的窗口以查找标题中的关键字的应用程序相比,使用BHO有几个优点。BHO是事件驱动的,不会在循环中运行或使用计时器,因此如果没有任何事情发生,它不会占用任何CPU周期。

 

自动填充

             

在Internet Explorer上鼠标右键单击的“自动填充”选项使你可以自动完成Web上的表单。输入你的信息,它会安全地存储在你自己的计算机上。当你想用先前输入的Web页面字段数据来填充表单时,只需右键单击页面,然后选择“自动填充”,然后选择“填充表单”。在下一步中,你可以从先前保存的表单中选择表单数据。

要保存初始数据,请填写表单,右键单击页面,然后选择“自动填充”,然后选择“另存为表单”选项。它会要求一个表单名称,用于保存输入的数据。自动填充将个人数据存储在你唯一可以访问的地方 - 你自己的计算机。此信息永远不会发送给我或任何其他服务器。

填写表单后,如果你发现所需的数据不在所选表单中,则可以使用“自动填充”->“清除表单”选项清除输入的数据,也可以手动输入数据。

 

    

比Google自动填充更好

它比Google自动填充更好。我正在研究一些好的功能。

 

 

字段独立

它不依赖于已经硬编码的html字段,因为Google自动填充限制用户只能填写Google在其自动填充模板表单中提供的那些字段。在我的自动填充中,任何类型的具有任何类型html字段的html表单都可以作为具有特定名称的模板表单数据保存。这样,用户不会被限制使用特定数据来填写表单,即使你使用的每种类型都是新表单,你也可以为这个特定表单创建一个模板数据,并在以后使用它。

 

BHO实现

一个最小的BHO是一个COM服务器DLL,它实现了IObjectWithSite。创建一个新的ATL项目并接受默认设置(具有属性,DLL)。添加一个ATL简单对象,给它一个名称,并在“选项”选项卡上选择“聚合:否”和“支持:IObjectWithSite”。

IObjectWithSite上唯一必须实现的方法是SetSite()。IE将调用SetSite并传递一个指向IUnknown的指针,我们可以查询该指针以获取指向IWebBrowser2的指针,这为我们提供了访问权限的关键。

 

//
// IOleObjectWithSite Methods
//
STDMETHODIMP CPub::SetSite(IUnknown *pUnkSite)
{
    if (!pUnkSite)
    {
        ATLTRACE(_T("SetSite(): pUnkSite is NULL\n"));
    }
    else
    {
        // Query pUnkSite for the IWebBrowser2 interface.
        m_spWebBrowser2 = pUnkSite;
        if (m_spWebBrowser2)
        {
            // Connect to the browser in order to handle events.
            HRESULT hr = ManageBrowserConnection(ConnType_Advise);
            if (FAILED(hr))
                ATLTRACE(_T("Failure sinking events from IWebBrowser2\n"));
        }
        else
        {
            ATLTRACE(_T("QI for IWebBrowser2 failed\n"));
        }
    }
    
    return S_OK;
}

一旦我们有了指向IWebBrowser2的指针,我们就可以连接到DWebBrowserEvents2连接点,以便接收NewWindow2事件。每次要打开新窗口时都会发送此事件。

要创建事件处理程序,我们必须从IDispatchImpl派生我们的类。

       

然后添加Invoke方法,如下所示

//
// IDispatch Methods
//
STDMETHODIMP CPub::Invoke(DISPID dispidMember, REFIID riid, LCID lcid,
    WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult,
    EXCEPINFO*  pExcepInfo,  UINT* puArgErr)
{
    if (!pDispParams)
        return E_INVALIDARG;
    
    switch (dispidMember)
    {
        //
        // The parameters for this DISPID are as follows:
        // [0]: Cancel flag  - VT_BYREF|VT_BOOL
        // [1]: IDispatch* - Pointer to an IDispatch interface. 
        //
        // If you cancel here, ALL popups will be blocked.
        //
    case DISPID_NEWWINDOW2:
        // Set the cancel flag to block popups
        pDispParams->rgvarg[0].pvarVal->vt = VT_BOOL;
        pDispParams->rgvarg[0].pvarVal->boolVal = VARIANT_TRUE;
        break;
    default:
        break;
   }
   
   return S_OK;
}

BHO出现的一个问题是,即使没有打开的浏览器窗口,链接器有时也会失败,因为某些进程正在使用BHO,迫使你重新启动计算机以释放它。原因是Windows资源管理器也使用IE作为其GUI,因此也会加载BHO。由于我们希望我们的BHO仅在我们启动IE时加载,因此我正在更改DllMain,使其不被Windows资源管理器加载。这应该消除链接器问题。

if (dwReason == DLL_PROCESS_ATTACH)
    {
        // Don't attach to Windows Explorer
        TCHAR pszLoader[MAX_PATH];
        GetModuleFileName(NULL, pszLoader, MAX_PATH);
        CString sLoader = pszLoader;
        sLoader.MakeLower();
        if (sLoader.Find(_T("explorer.exe")) >= 0)
            return FALSE;

        g_hinstPub = _AtlBaseModule.m_hInst;
    }

现在不打算深入探讨BHO的更多细节,我将继续讨论表单处理程序。

我创建了三个鼠标右键菜单选项。

 

1. 另存为表单

此选项支持一个事件处理程序,它将特定表单的模板数据保存在预定义的位置,你以后可以使用它来自动填充表单。

 

Save Form As

 

2. 自动填充

此选项支持实际的自动填充功能。选择此选项后,它会打开一个对话框,用户可以从先前保存的数据中选择一个模板数据文件。

AutoFill

3. 清除表单

如果你不想提交自动填充的表单,那么你可以选择此选项来清除表单

支持鸣谢

我正在接受John Osborn的文章弹出窗口阻止程序的支持。谢谢John,感谢你的文章。

© . All rights reserved.