views:

36

answers:

1

Is there a way to hook for a particular windows message without subclassing the window.

There is WH_GETMESSAGE but that seems create performance issues.

Any other solutions apart from these which doesn't deteriorate performance?

A: 

AFAIK there's no better solution than what you mentioned. And, of course, subclassing the window is better than hooking all the messages of the thread.

Let's think which path the message passes up until it's handled by the window:

  1. The message is either posted or sent to the window, either by explicit call to PostMessage/SendMessage or implicitly by the OS.
  2. Posted messages only: eventually the thread pops this message from the message queue (by calling GetMessage or similar), and then calls DispatchMessage.
  3. The OS invokes the window's procedure by calling CallWindowProc (or similar).
  4. The CallWindowProc identifies the window procedore associated with the window (via GetClassLong/GetWindowLong)
  5. The above procedure is called.

Subclassing - means replacing the window procedure for the target window. This seems to be the best variant. Installing hook with WH_GETMESSAGE flag will monitor all the messages posted to the message queue. This is bad because of the following:

  1. Performance reasons.
  2. You'll get notified only for windows created in the specific thread
  3. You'll get notified only for posted messages (sent messages will not be seen)
  4. A "posted" message doesn't necessarily means "delivered". That is, it may be filtered by the message loop (thrown away without calling DispatchMessage).
  5. You can't see what the actual window does and returns for that message.

So that subclassing seems much better.

One more solution - in case your specific message is posted (rather than sent) you may override the message loop, and for every retrieved message you may do some pre/post-processing

valdo