Start small and work up

I re-learned an important lesson tonight: start small and work up from there.

I was working on creating a Form that intercepts the WM_MOUSEACTIVATE message to prevent a click from stealing focus from another form (i.e. a menu, or a drop down list). In my experimentation I had a “grand” idea to create a class that implements IMessageFilter which would keep a map of the Handle of a form and all its controls (and their controls, etc.) and intercept all WM_MOUSEACTIVATE messages for the “registered” controls. (Keep in mind I was experimenting, and the intended use of this is a small form that doesn’t have a huge control tree to track.)

I wrote probably about 100 lines of code (fortunately my lesson was learned on a small scale first!) to handle the registering of controls, the watching of controls added to Controls collections, the cleaning up on disposal, and so on. Finally my masterpiece was complete, I ran it, and … nothing happened. Huh? Debugging showed that the message filter was active and kicking, my controls were registered, but I was never receiving the WM_MOUSEACTIVATE message (as I did when I overrode WndProc). A bit of Google searching turned up the answer (below).

So I guess I learned two lessons:

  1. Start small and work up from there, and
  2. An IMessageFilter only processes windows messages that are posted (PostMessage) and not sent (SendMessage)—and WM_MOUSEACTIVATE is sent. Had I tried to intercept this message via the filter before I created all the supporting code, I could’ve saved myself some time.

Live and learn! (And pass it on!)

This entry was posted on Thursday, September 28th, 2006 at 12:20 am and is filed under windows forms. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

Comments are closed.