Click here to Skip to main content
Click here to Skip to main content

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

By , 1 Jul 2003
 

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)

About the Author

Rama Krishna Vavilala
Architect
United States United States
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralIt worked!memberNacnudrium15 Jun '09 - 12:44 
I added "edit.aspx" to the apply paths:
 
string[] applyPaths = new string[] {"user_reply.asp", "user_new.asp", "edit.aspx"};
 

 
and changed "Sig" to "ctl00_MC_Signature"
 
string destElemId = "ctl00_MC_Signature";
 
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
Generaltest 10 - it will work this timememberNacnudrium15 Jun '09 - 12:43 
test 10
 
Hey, at least Logo had, at it's inception, a mechanical turtle. VB has always lacked even that... - Shog9 04-09-2002
Generaltest nmemberNacnudrium15 Jun '09 - 12:33 
test n
Generaltest 8memberNacnudrium15 Jun '09 - 12:22 
test 8
GeneralTest 7memberNacnudrium15 Jun '09 - 12:20 
Test 7 change element it is looking for.
Generaltest 6 - sighmemberNacnudrium15 Jun '09 - 12:13 
test 6
Generaltest 5 - hope it works this timememberNacnudrium15 Jun '09 - 12:09 
test 5
Generaltest 4 - sorrymemberNacnudrium15 Jun '09 - 12:05 
test 4
Generaltest 3memberNacnudrium15 Jun '09 - 12:02 
test 3
Generaltest 2...memberNacnudrium15 Jun '09 - 10:56 
test 2...
GeneraltestmemberNacnudrium15 Jun '09 - 10:55 
test
GeneralTestmemberRBRiddick6 May '09 - 4:48 
Hm, seems not to work for me.
GeneralRe: TestmemberRBRiddick6 May '09 - 23:50 
If it won't work, change hosts, applyPaths and destElemId.
 
Hey, at least Logo had, at it's inception, a mechanical turtle. VB has always lacked even that... - Shog9 04-09-2002
Generaltest testmemberVuNic30 Mar '09 - 7:57 
Laugh | :laugh: Laugh | :laugh: . That's my turn to "test" here. Laugh | :laugh:
 
He never answers anyone who replies to him. I've taken to calling him a retard, which is not fair to retards everywhere.-Christian Graus

Generaltestmemberchen_kinnrot26 Jan '09 - 9:22 
test
Generaltest 1/11/2009memberjmort11 Jan '09 - 20:05 
Last one of the day...
General2nd Test 1/11/2009memberjmort11 Jan '09 - 17:08 
Testing 123
GeneralTest 1/11/2009memberjmort11 Jan '09 - 16:56 
Testing 123 testing using VS 2005 Express to build the project.
Generalit Does not workmemberkuszob31 Dec '08 - 18:41 
the setup did run as well but it does not work for me.
i checked on the add-ons and the autosig.bho is enabled.
 

when i try to unregister/register with my hands then i got this:
 

C:\Program Files\CodeProject\AutoSig>regasm /unregister AutoSig.dll
Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.1433
Copyright (C) Microsoft Corporation 1998-2004. All rights reserved.
 
Types un-registered successfully
 

C:\Program Files\CodeProject\AutoSig>regasm /codebase AutoSig.dll
Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.1433
Copyright (C) Microsoft Corporation 1998-2004. All rights reserved.
 
RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can ca
use your assembly to interfere with other applications that may be installed on
the same computer. The /codebase switch is intended to be used only with signed
assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully
 
Do anybody what is the problem?
Generaltestmemberkuszob31 Dec '08 - 18:31 
test
Generaltestmembercre006730 Dec '08 - 4:52 
...
Generaltestmembersavage_panda29 Oct '08 - 14:35 
test
Generaltestmemberdjbobo10 Sep '08 - 5:35 
test
GeneralKnowledgemembershamshadgem2 Sep '08 - 18:17 
What r "BHO"
please give me a sample
thank'sssssssssssssssssssssssssssssssssssssssssssssssssssss
 
sha;
GeneralGamesmembershamshadgem2 Sep '08 - 17:51 
Hello i m shamshad & i want to do
 
------------------------

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 2 Jul 2003
Article Copyright 2003 by Rama Krishna Vavilala
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid