Home   .......

Using Windows API in VB Tutorial

Callbacks

Products  
eXamples  
Files  
e-Mail Us  
 

 

A callback is a function you write and tell Windows to call for some reason. You create your own function with a specified number and type of parameters, then tell Windows that this function should be called for some reason and its parameters filled with some info you need. Then Windows calls your function, you handle the parameters and exit from the function returning some kind of value.

A typical use of callbacks is for receiving a continuous stream of data from Windows. Here is the declaration of a function that requires a callback:

Declare Function EnumWindows Lib "User32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

The first parameter is the address of your callback function, and the second is a whatever value you want. This value will be passed to your function, so that you know what it is called for.

VB 5.0 has provided a useful operator called AddressOf which returns the address of a function (there is no such operator in VB 4.0). It may be used only in front of a parameter when you call a function and uses like

FuncP = AddressOf MyFunction

are wrong and cause error. So, you must call EnumWindows like that:

Success& = EnumWindows(AddressOf cbFunc, 58&)

You must also write the callback function. There are different type of callbacks that have a different sets of parameters. Description of this parameter can be found in a SDK Help file or MS SDK documentation. Here is the declaration for the callback:

Public Function cbFunc (ByVal Hwnd As Long, ByVal lParam As Long) as Long

Here is a sample of callbacks:

(paste this code in a module, as callbacks should be Public)

Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function EnumWindows Lib "User32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public Function cbFunc(ByVal Hd As Long, ByVal lParam As Long) As Long
If lParam = 58 Then 'enum windows
Dim St As String
St = Space(255)
Ret& = GetWindowText(Hd, St, Len(St))
Debug.Print Left(St, Ret&)
cbFunc = 1
End If
End Function

(paste the following in a form module with a command button on it)

Private Sub Command1_Click()
Success& = EnumWindows(AddressOf cbFunc, 58&)
End Sub

Note that the function returns 1. If it returns 0, the enumeration will stop. Watch the Immediate Window.

This sample enumerates the captions of all (literally) windows (no childs).

 
Copyright (c) 1998, Billy&George Software and Peter Dimitrov
Revised March 2000