Subclassing mit Access

Praxisbeispiel

Natürlich wollen wir unser Praxisbeispiel nicht ganz aus den Augen verlieren. Wir wollten per Subclassing verhindern, dass Access geschlossen wird, ohne dass eventuelle Aufräumarbeiten oder eine Rückfrage an den Benutzer erfolgt sind. Dazu erweitern Sie die Routine fctHookAccess- Window, fügen noch einige Konstanten hinzu und ergänzen die Funktion SchliessenAbfrage wie in Listing 3.

Option Compare Database
Option Explicit
Private Declare Function CallWindowProcA Lib "user32" (ByVal lpPrevWndFunc As Long,
ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long)
As Long
Private Declare Function SetWindowLongA Lib "user32" (ByVal hwnd As Long, ByVal
nIndex As Long, ByVal wNewWord As Long) As Long
Private Const GWL_WNDPROC As Long = (-4)
Private Const WM_SYSCOMMAND As Long = &H112
Private Const SC_CLOSE As Long = &HF060&
Private Const WM_CLOSE As Long = &H10
Private Const WM_QUERYENDSESSION As Long = &H11
Private lngProc As Long
Private lngHwnd As Long
Private boolCancel As Boolean
Public Function fctHookAccessWindow(ByVal hwnd As Long, ByVal msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Select Case msg
Case WM_SYSCOMMAND
'Schließen übers Kreuz, Alt + F4 oder die Taskleiste
If wParam = SC_CLOSE Then
boolCancel = SchliessenAbfrage("Schließen via x, Alt + F4 oder
Tastleiste")
End If
Case WM_CLOSE
'Schließen über das Menü, das Application- bzw. Docmd-Objekt
'oder über externe SendMessages etc.
boolCancel = SchliessenAbfrage("Schließen via Menü, Application-Objekt/
DoCmd-Objekt")
Case WM_QUERYENDSESSION
'Windows wird heruntergefahren
boolCancel = SchliessenAbfrage("Schließen, weil Windows heruntergefahren
wird")
Case Else
End Select
If boolCancel = False Then
fctHookAccessWindow = CallWindowProcA(lngProc, hwnd, msg, wParam, lParam)
'UnSubclass
Else
boolCancel = False
fctHookAccessWindow = 0&
End If
End Function
Private Function SchliessenAbfrage(strGrund As String) As Boolean
Dim str As String
str = "Möchten Sie die Datenbank wirklich schließen (" & strGrund & ")?"
If MsgBox(str, vbQuestion Or vbYesNo) = vbNo Then
SchliessenAbfrage = True
End If
End Function
Public Function Subclass() As Long
lngHwnd = Application.hWndAccessApp
lngProc = SetWindowLongA(lngHwnd, GWL_WNDPROC, AddressOf fctHookAccessWindow)
End Function
Public Function UnSubclass()
SetWindowLongA lngHwnd, GWL_WNDPROC, lngProc
lngProc = 0
End Function

Die Funktion fctHookAccessWindowfragt nunmehr gezielt bestimmte Werte für die Message- Nummer ab, die alle zum Beenden von Access führen können. Die Routine SchliessenAbfrage fragt den Benutzer, ob er Access wirklich schließen soll und gibt das Ergebnis an fctHookAccess- Window zurück, die den Schließen-Vorgang entweder durchzieht oder abbricht.

Mehr zum Thema

In diesem Artikel haben Sie einige Grundlagen zum Subclassing kennen gelernt. Mit ein wenig Online-Recherche lassen sich damit interessante Dinge erledigen. In einer der folgenden Ausgaben stellt inside Access Verbesserungen der aktuellen Version dieses Beispiels sowie weitere Einsatzbereiche von Subclassing vor.