Implementing the WH_MOUSE Hook

I also chose to include a WH_MOUSE hook example because it requires the use of a user-defined type. In VB.NET, user-defined types are gone and are replaced by structures. The example presented here will explain how to use a structure in place of a user-defined type.

Tip

If you are going to port any of this code to C#, you must add an attribute to the structure definition. The following is an example of this:

[StructLayout(LayoutKind.Sequential)]
public struct MOUSEHOOKSTRUCT
{ 
 public pt As
POINTAPI 
 public hwnd As Integer 
 public wHitTestCode As Integer 
 public dwExtraInfo As Integer
}

Examining the IL that the VB.NET application generated, we see the following

.class value sequential ansi sealed nested
public
modl$POINTAPI 
extends [mscorlib]System.ValueType
{ 
} // end of class
mod1$POINTAPI

The structure is actually created as a class that inherits from the System.Value.Type class -- the word extends in the previous IL code implies “inherits from.” VB.NET automatically marks this class as sequential.

The Application

This application’s UI is laid out exactly as in the previous example of the WH_KEYBOARD hook, which Figure 23-2 shows. The Hook button installs the WH_MOUSE hook, and the UnHook button removes this hook.

The filter function values are printed to the text box on the form whenever this hook is called. To see messages written out to this text box, move the mouse or click one of its buttons.

The .VB File

Example 23-3 presents the code contained in ...

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.