AutoSig: 一个浏览器辅助对象, 当您在 CP 论坛发帖时, 它会自动添加不同的签名






4.65/5 (16投票s)
一个浏览器辅助对象,
引言
在看到Kant的文章后,我受到启发写了这篇文章。Kant写了一个实用程序,可以创建引语集合并以XML格式保存。用户可以选择将随机引语复制到剪贴板,然后粘贴到CP消息板发布消息时的签名栏中。这个功能在Desktop Bob中也有。我设想,如果随机引语能自动填入签名栏,那将是多么方便。这个实用程序就能做到这一点。当您安装该实用程序并在CP上导航到任何可以发布消息的URL时,签名栏会自动填充XML文件中的一个引语。您只需要手动或使用CodeProjectQuote实用程序在XML文件中编写一些引语。安装和源代码中提供了一个默认的XML文件(从Kant的文章复制而来)。
安装和使用
以下是安装和使用该实用程序的步骤。
- 下载并解压安装zip文件
- 在Windows Explorer中双击AutoSigSetup.msi。您的机器上需要安装Windows Installer 2.0。您的系统很可能已经安装了。您还需要是该机器的管理员才能安装该实用程序。
- 导航到CodeProject中可以发布新消息的URL。签名栏会自动填入。每次您重新导航(而不是刷新)到此页面时,都会出现不同的签名。请注意,您的默认签名将被替换。如果您想保留默认签名,只需刷新页面即可。
- 显然,您需要将自己的引语添加到签名XML文件中。该实用程序的默认安装会将一个名为sigs.xml的文件放置在应用程序所在的文件夹中(尽管这通常不是一个好习惯)。您可以直接在那里编辑该文件。
- 如果您愿意,可以通过修改注册表项HKEY_CURRENT_USER\Software\CodeProject\AutoSig下的SigFilePath值来指向另一个签名XML文件位置。您在此注册表值中输入的数据应该是新签名XML文件的完整路径。
构建代码
如果您决定自行构建该实用程序而不是使用安装应用程序,则需要执行以下步骤。
- 下载并解压源码zip文件
- 如果您使用的是VS.NET 2002,请打开AutoSig2000.sln;如果您使用的是VS.NET 2003,请打开AutoSig.sln。
- 构建解决方案。
- 打开命令提示符窗口,并转到AutoSig2002或AutoSig项目的输出目录
- 键入Regasm /codebase AutoSig.dll。这将注册该实用程序。
- 将sigs.xml文件复制到输出目录,或参考“安装和使用”部分的步骤5来指定其他路径
- 编辑sigs.xml文件以添加您自己的引语
工作原理
该实用程序是一个浏览器辅助对象(Browser Helper Object)。浏览器辅助对象是为每个Internet Explorer浏览器窗口实例化的COM对象。Internet Explorer将IWebBrowser2
接口指针传递给浏览器辅助对象。由浏览器辅助对象自行决定如何使用它。BHO需要实现COM接口IObjectWithSite
。在C#中,该接口如下所示。
[ ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352") ] public interface IObjectWithSite { [PreserveSig] int SetSite([MarshalAs(UnmanagedType.IUnknown)]object site); [PreserveSig] int GetSite(ref Guid guid, out IntPtr ppvSite); }Internet Explorer在实例化BHO后调用
SetSite
方法。site
参数实际上是一个实现了IWebBrowser2
接口的对象。对于AutoSig,此方法的实现从注册表中读取配置值,并添加一个事件处理程序到DocumentComplete
事件,并将对象存储在一个成员变量中。当Internet Explorer窗口关闭时,它会再次调用SetSite
方法,并传递一个null
值。AutoSig BHO在此情况下会移除事件处理程序。if (site != null) { webBrowser = (WebBrowser)site; webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler( this.OnDocumentComplete); } else { webBrowser.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler( this.OnDocumentComplete); webBrowser = null; }
现在,每次浏览器完成到网站的导航时,都会调用OnDocumentComplete
方法。该方法中的代码执行以下操作:
- 检查导航URL是否属于CodeProject域之一。
- 如果上述条件为真,它会检查该URL是否是CP中用于向论坛发布消息(无论是新消息还是回复)的URL。
- 如果两个条件都为真。代码将获取对textarea元素(用户在此处键入签名)的DOM对象的引用。
object sigObj = document.all.item(destElemId, 0); IHTMLTextAreaElement sig = sigObj as IHTMLTextAreaElement;
- 现在需要做的就是从XML文件中获取一个签名,并将其分配给textarea的
value
属性。这是异步完成的,原因很简单,从XML文件中读取可能需要一些时间,在此期间用户仍然可以继续编写消息。实际上,我认为所花费的时间是可以忽略不计的。XML文件可以一次性读取并存储在内存中,但我更倾向于尽可能节省内存,因此每次都会读取文件。异步调用是通过异步委托完成的。//private delegate void SetRandomSigDelegate( // IHTMLTextAreaElement textArea); SetRandomSigDelegate delg = new SetRandomSigDelegate( this.SetRandomSig); delg.BeginInvoke((IHTMLTextAreaElement)sig, new AsyncCallback(this.OnAsyncCallComplete), delg);
从线程池中的一个线程调用的SetRandomSig
方法会读取xml文件,从中选择一个值并将其放入textarea。
最终评论
我希望该实用程序能对CP会员有所帮助。目前只有一个已知的bug,即刷新页面时签名不会设置。这是因为DocumentComplete
事件没有被触发。欢迎提供解决此问题的建议。感谢Kant和Daniel Truni为本文提供的灵感。
更新于2003年7月2日
人们遇到的一个常见问题是安装程序不起作用。这是因为项目中所需的程序集microsoft.mshtml.dll没有包含在安装文件中。这样做是因为该文件将安装大小增加到近2 MB。在此版本中,已删除了对该程序集的依赖。取而代之的是,我创建了一个名为mshtmlsubset.dll的新程序集,其中只包含AutoSig使用的接口。这大大减小了安装体积。
历史
- 2003年7月2日 - 修复,移除了对mshtml.tlb的依赖
- 2003年6月7日 - 初始发布