Caveats

This hook’s most outstanding feature is that you can use it only as a system-wide hook. This means that the filter function must reside in a Win32 DLL. This DLL is injected into every running process. Therefore, this hook carries with it a bigger performance penalty than thread-specific hooks.

You should remember that this hook intercepts sent messages only. During the modal loop, no messages can be posted to the thread’s message queue.

Watch your return values because a returned zero will prevent any other WH_MSGFILTER hook from operating. Because this hook is installed only as a system-wide hook, if a zero is returned, it means that no WH_MSGFILTER hooks will be called from within any thread. This could cause other applications that rely on these hooks to fail.

Some additional MSGF_ messages are defined in Winuser.h, but this hook currently is not implementing them. These messages are:

Public Const MSGF_MAINLOOP = 8      'Not used with SysMsgFilter Hook
Public Const MSGF_MAX = 8           'Not used with SysMsgFilter Hook
Public Const MSGF_MESSAGEBOX = 1    'Not used with SysMsgFilter Hook
Public Const MSGF_MOVE = 3          'Not used with SysMsgFilter Hook
Public Const MSGF_SIZE = 4          'Not used with SysMsgFilter Hook
Public Const MSGF_USER = 4096       'Not used with SysMsgFilter Hook
Public Const MSGF_NEXTWINDOW = 6    'Not used with SysMsgFilter Hook

Even though this hook intercepts a subset of the messages that hooks such as WH_CALLWNDPROC or WH_CALLWNDPROCRET intercept, you should still watch how this hook ...

Get Subclassing and Hooking with Visual Basic now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.