Click here to Skip to main content
15,881,092 members
Articles / Programming Languages / C#
Article

AutoSig: A browser helper object that automatically adds a different signature when you post a message to a CP forum

Rate me:
Please Sign up or sign in to vote.
4.65/5 (17 votes)
1 Jul 2003CPOL5 min read 328.8K   642   62   147
A browser helper object that automatically adds a different signature when you post a message to a CP forum

Introduction

I was inspired to write this article after seeing this article by Kant. Kant wrote a utility that allows creation of quotes collection and saving in XML format. User can chose to copy a random quote to the clipboard which can be pasted in the signature field when posting a message to a CP message board. The same feature is also available in Desktop Bob. I imagined that it would be kind of nice if a random quote automatically got into the signature field. This utility does that. When you install the utility and navigate to any url in CP from where you can post a message, the signature field is automatically filled with one of the quotes from an XML file. All you need to do is to write some quotes in an XML file either manually or using the CodeProjectQuote utility. A default XML file (copied from Kant's article) is provided with the setup and the source.

Installation and Use

Here are the steps you need to take to install and use the utility.

  1. Download and extract the setup zip file
  2. Double click on the AutoSigSetup.msi from Windows Explorer. You need to have windows installer 2.0 on your machine. It is very likely that your system already has it. You also need to be an administrator on the machine to install the utility.
  3. Navigate to a URL in code project from where you can post a new message. The signature field is automatically filled in. Every time you renavigate (not refresh) to this page a different signature comes up. Note that your default signature will be replaced. If you want to keep your default sig just rfresh the page.
  4. Obviuosly you will need to add your own quotes to the signature XML file. The default installation of the utility places an XML file named sigs.xml in the same folder as the app itself (Although this is not a very good practice in general). You can edit the file there itself.
  5. If you chose you can point to a different location for the signature XML file by modifying the registry value SigFilePath under the key HKEY_CURRENT_USER\Software\CodeProject\AutoSig. The string data you place in this registry value should be the full path of the new signature XML file.

Building the Code

If instead of using the installation app you decide to build the utility yourself, you need to take the following steps.

  1. Download and extract the source zip file
  2. Open AutoSig2000.sln if you are using VS.NET 2002 or AutoSig.sln if you are using VS.NET 2003.
  3. Build the solution.
  4. Open a command prompt window and go to the output directory of the AutoSig2002 or AutoSig project
  5. Type Regasm /codebase AutoSig.dll . This will register the utility.
  6. Copy sigs.xml file to the output directory or see step 5 in the Installation and use section to specify a different path
  7. Edit sigs.xml file to add your own quotes

How it Works

The utility is a Browser Helper Object. A Browser Helper Object is a COM object that is instantiated for every Internet Explorer browser window. Internet Explorer passes the IWebBrowser2 interface pointer to the Browser Helper Object. It is upto the Browser Helper Object to make use of it in whatever way it wants to. The BHO needs to implement the COM interface IObjectWithSite. In C# the interface looks like this.

[
    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 calls the SetSite method after it instantiates the BHO. The site parameter is actually an object which implements IWebBrowser2 interface. In case of AutoSig the implementation of this method reads configuration values from the registry and adds an event handler to the DocumentComplete event and stores the object in a member variable. When Internet Explorer window closes, it calls the SetSite method again passing a null value. The AutoSig BHO removes the event handler when such condition occurs.
if (site != null)
{
  webBrowser = (WebBrowser)site;
  webBrowser.DocumentComplete +=
     new DWebBrowserEvents2_DocumentCompleteEventHandler(
         this.OnDocumentComplete);
}
else
{
    webBrowser.DocumentComplete -=
      new DWebBrowserEvents2_DocumentCompleteEventHandler(
         this.OnDocumentComplete);
    webBrowser = null;
}

Now everytime the browser completes navigation to a web site the OnDocumentComplete method is called. The code in this method does the following:-

  1. Checks whether the naviagtion URL belongs to one of the CodeProject domains.
  2. If the above condition was true it sees whether the URL is one used in CP to post a message to a forum (either a new message or a reply).
  3. If both the conditions are true. The code obtains a reference to the DOM object corrensponding the the textarea element where the user types a signature.
    object sigObj = document.all.item(destElemId, 0);
    IHTMLTextAreaElement sig = sigObj as IHTMLTextAreaElement;
  4. Now all that needs to be done is to get a signature from the XML file and assign it to the value property of the textarea. This is done asynhcronously for the simple reason that reading from the XML file may take some time during that time the user can still continue typing his message. In practice however I find that the time taken is negligible. The XML file could have been read at once and stored in memory but I prefer conserving memory as much as possible so the file is read each time. The asynchronous call is done using an asynchronous delegate.
    //private delegate void SetRandomSigDelegate(
    //        IHTMLTextAreaElement textArea);
    
    SetRandomSigDelegate delg = new SetRandomSigDelegate(
        this.SetRandomSig);
    delg.BeginInvoke((IHTMLTextAreaElement)sig, 
        new AsyncCallback(this.OnAsyncCallComplete), delg);

    The SetRandomSig method which gets called from a thread in the threadpool reads the xml file and selects a value from it and places it in the textarea.

Final Comments

I hope the utility proves useful to fellow CPians. Currently there is only one known bug, that is when the page is refreshed the signature is not set. This happens because the DocumentComplete event does not get fired. Any suggestions on how to solve this problem is welcome. Thanks to Kant and Daniel Truni for providing inspiration for the article.

Update July 2, 2003

A common problem people faced was that the installation app did not work. This was because microsoft.mshtml.dll - an assembly required by the project was not included with the setup. This was done because this file increased the setup size to almost 2 MB. In this version now the dependency on the assembly is removed. Instead I have created a new assembly called mshtmlsubset.dll which includes only those interfaces used by AutoSig. This reduces the size of installation drastically.

History

  • July 2, 2003 - Fixed to remove dependency on mshtml.tlb
  • June 7, 2003 - Initial Release

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralIt worked! Pin
Nacnudrium15-Jun-09 12:44
Nacnudrium15-Jun-09 12:44 
Generaltest 10 - it will work this time Pin
Nacnudrium15-Jun-09 12:43
Nacnudrium15-Jun-09 12:43 
Generaltest n Pin
Nacnudrium15-Jun-09 12:33
Nacnudrium15-Jun-09 12:33 
Generaltest 8 Pin
Nacnudrium15-Jun-09 12:22
Nacnudrium15-Jun-09 12:22 
GeneralTest 7 Pin
Nacnudrium15-Jun-09 12:20
Nacnudrium15-Jun-09 12:20 
Generaltest 6 - sigh Pin
Nacnudrium15-Jun-09 12:13
Nacnudrium15-Jun-09 12:13 
Generaltest 5 - hope it works this time Pin
Nacnudrium15-Jun-09 12:09
Nacnudrium15-Jun-09 12:09 
Generaltest 4 - sorry Pin
Nacnudrium15-Jun-09 12:05
Nacnudrium15-Jun-09 12:05 
Generaltest 3 Pin
Nacnudrium15-Jun-09 12:02
Nacnudrium15-Jun-09 12:02 
Generaltest 2... Pin
Nacnudrium15-Jun-09 10:56
Nacnudrium15-Jun-09 10:56 
Generaltest Pin
Nacnudrium15-Jun-09 10:55
Nacnudrium15-Jun-09 10:55 
GeneralTest Pin
RBRiddick6-May-09 4:48
RBRiddick6-May-09 4:48 
GeneralRe: Test Pin
RBRiddick6-May-09 23:50
RBRiddick6-May-09 23:50 
Generaltest test Pin
Eytukan30-Mar-09 7:57
Eytukan30-Mar-09 7:57 
Generaltest Pin
chen_kinnrot26-Jan-09 9:22
chen_kinnrot26-Jan-09 9:22 
Generaltest 1/11/2009 Pin
jmort11-Jan-09 20:05
jmort11-Jan-09 20:05 
General2nd Test 1/11/2009 Pin
jmort11-Jan-09 17:08
jmort11-Jan-09 17:08 
GeneralTest 1/11/2009 Pin
jmort11-Jan-09 16:56
jmort11-Jan-09 16:56 
Generalit Does not work Pin
kuszob31-Dec-08 18:41
kuszob31-Dec-08 18:41 
Generaltest Pin
kuszob31-Dec-08 18:31
kuszob31-Dec-08 18:31 
Generaltest Pin
cre006730-Dec-08 4:52
cre006730-Dec-08 4:52 
Generaltest Pin
savage_panda29-Oct-08 14:35
savage_panda29-Oct-08 14:35 
Generaltest Pin
djbobo10-Sep-08 5:35
djbobo10-Sep-08 5:35 
GeneralKnowledge Pin
shamshadgem2-Sep-08 18:17
shamshadgem2-Sep-08 18:17 
GeneralGames Pin
shamshadgem2-Sep-08 17:51
shamshadgem2-Sep-08 17:51 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.