Té technice se říká subclassing (někdy též "hákování") a rámcově se provádí tak, že událostní proceduře okna podstrčíte delegáta (pointer) funkce, která se napíchne ("zahákne") na frontu systémových vzkazů, které generují frontu událostí - na ty požadované provede vlastní akci, na ty zbývající zavolá výchozí systémovou proceduru WndProc, která dokončí normální zpracování. Okno - které může představovat libovolný ovládací prvek by pak nemělo "poznat", že jej volá jiná, než při vytvoření okna zaregistrovaná procedura. Daná ukázka parametry systémových volání prostě vypisuje do konzole tak, jak přicházejí do okna ListView.
Imports System.Windows.Forms
Module MMain
Delegate Function SubClassDelegate%(hwnd%, msg%, wParam%, lParam%)
Declare Sub CallWindowProcA Lib "USER32.DLL" (lpPrev%, hwnd%, msg%, wParam%,lParam%)
Declare Function SetWindowLongA% Lib "USER32.DLL" (hwnd%, attr%, lVal%)
Declare Function SetWindowLongA% Lib "USER32.DLL" (hwnd%, attr%, lVal As SubClassDelegate)
Dim WithEvents LV As New ListView: Dim lptHandler%
Sub Main
Dim F As New Form(): F.Controls.Add(LV)
For i As Integer = 1 To 100: LV.Items.Add(i): Next
lptHandler = SetWindowLongA(LV.Handle.ToInt32, -4, AddressOf SubClassProc)
Application.Run(F)
End Sub
Function SubClassWindow(ByVal hWnd%)
SetWindowLongA(hWnd, (-4), AddressOf SubClassProc)
End Function
Function SubClassProc%(hWnd%, lMsg%, wParam%, lParam%)
Select Case lMsg
Case Else
System.Console.WriteLine("{0} {1} {2}", lMsg, wParam, lParam)
CallWindowProcA(lptHandler, hWnd, lMsg, wParam, lParam)
End Select
End Function
End Module
