Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

EventSpy

0.00/5 (No votes)
9 Oct 2005 3  
Sick and tired of writing diagnostic event handlers to see when a control is firing events? You need EventSpy!

Sample Image - eventspy.jpg

Introduction

Recently I was writing an application that used two RichTextBoxes next to each other, and I wanted them to scroll simultaneously, but the Scroll events weren't appearing to fire! After 10 minutes of documentation reading I thought, wouldn't it be better if I had a tool that told me when events fired? That's when I started to research EventSpy.

I started off with a bit of reflection, looping through the events of an object and building and linking a System.EventHandler for every event; this worked, but it threw a nasty error if the event wasn't using a System.EventHandler.

foreach (EventInfo info in t.GetEvents())
{
   info.AddEventHandler(new System.EventHandler(this.EventHandler));
}

So then I went onto using a completely different method. For each event in the object, EventSpy using Code DOM to spit out a custom event handler code for each event. This allowed me to also capture specialist EventHandlers such as MouseMoveEventHandler. Once custom event handling code has been spat out by Code DOM, EventSpy then compiles the class in memory, and links it up with the object it is spying on. I found this to be a really nifty solution, as it's still very fast but allows me to see all that's going on with the object.

The Code

EventSpy is implemented as a single DLL. Even though it is implemented as a DLL you should only use EventSpy during development. Unfortunately I could not come up with a good enough way to have EventSpy as a standalone exe, so I did the next best thing, two lines of code. Here is some sample code on how to use EventSpy, this just spies on a very basic class that throws an event. EventSpy can be used on any object, such as a textbox, a button or a custom business class.

public class Dummy
{
    public delegate void DummyEventHandler(string something);
    public event DummyEventHandler DummyEvent;

    public void RaiseEvent()
    {
        if (DummyEvent != null)
            DummyEvent("Hello World!");
    }
}

EventSpy.EventListener listener = new EventSpy.EventListener();
Dummy dummy = new Dummy();

listener.AttachTo(dummy);

dummy.RaiseEvent();

After the listener.AttachTo line, the main EventSpy window will pop up, with a list of events that have occurred, and you may filter out events that you don't want to spy on, or view what was passed in the events parameters. Very cool if you ask me, it's saved me loads of time on Windows Forms development.

License

You may use EventSpy however you like, just give me a bit of credit. If people are interested in helping improve EventSpy, then drop me a line and we could get a SourceForge project going. EventSpy definitely needs a code cleanup, I'll get that done ASAP, I kind of rushed EventSpy so that I could get using it!

History

  • 2005-09-10 - Original article posted.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here