通用自动填充






3.91/5 (10投票s)
通用自动填充可以使用一些基于PC的存储数据自动填充基于html的表单。它是一款非常类似于Google自动填充的应用程序。
引言
自动填充是以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. 另存为表单
此选项支持一个事件处理程序,它将特定表单的模板数据保存在预定义的位置,你以后可以使用它来自动填充表单。
2. 自动填充
此选项支持实际的自动填充功能。选择此选项后,它会打开一个对话框,用户可以从先前保存的数据中选择一个模板数据文件。
3. 清除表单
如果你不想提交自动填充的表单,那么你可以选择此选项来清除表单
支持鸣谢
我正在接受John Osborn的文章弹出窗口阻止程序的支持。谢谢John,感谢你的文章。