Microsoft warns, in its hook article, that systemwide CALLWNDPROC-hooks are a significant drain on performance and they should only be used for debugging purposes. This hook type is very handy for screen reading, though, because you can intercept every message sent to a window. In the example program, a CALLWNDPROC hook is used to monitor button state changes and track menus. Microsoft's MSDN documentation (Microsoft, 1999, CallWndProc) also mentiones that CALLWNDPROC hook functions cannot modify there arguments which is a good thing as far as screen readers are concerned. As to parameters for CALLWNDPROC, wParam is non-zero if the message was sent out by the current thread. lParam contains a pointer to a CWPSTRUCT struct, whose fields match the window procedure parameters exactly.