Introduction
Recently I was writing an application that used two RichTextBox
es 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 EventHandler
s 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.