WizHook: A Hidden Access Object With Intriguing Potential

I ran across this bit of very-hidden quite arcane VBA UI wizardry, and it needs to see the light of day.

That's how Mark Burns–no stranger to the far reaches of the Microsoft Access community–began a recent email he sent me.  And it got my attention.  After all, what feature could be (1) so hidden that Mark had never seen it before and (2) so intriguing that he felt compelled to share it with me?

The wizardry to which Mark referred is the hidden WizHook object.

What is WizHook?

WizHook is a hidden property of the Access.Application object.

To discover it for yourself:

  1. Open the Object Browser ([F2]) in the VBIDE
  2. Right-click in the header section to open the context menu
  3. Check the box to "Show Hidden Members"
  4. Choose "Access" from the library dropdown
  5. Click on the "Application" class
  6. Click on the "WizHook" member
  7. Click on the "WizHook" link to open the WizHook class

Microsoft Access WizHook Reference

The best English-language documentation I have come across is JasonM's PDF, Microsoft Access WizHook Reference.

Jason's documentation starts off with the following disclaimer:

I always noticed [the WizHook object] had some interesting sounding procedure names, but there's almost no reference to it on the internet. This is my attempt at documenting it the best I can. Please understand the vast majority of this is the result of trial and error, so if you find a mistake or have a better interpretation of what's happening, please email me so I can update this document.

Additional Documentation

WizHook documentation is notoriously sparse.  

Outside of JasonM's PDF, some of the best documentation for the WizHook object lives on foreign language forums.

Here are the most useful forum posts I could find:

The Secret WizHook Handshake

Oh, I almost forgot the most important part of all!

Before you can call most of the methods of the WizHook object, you have to unlock it by assigning the magic number 51488399 to its Key property:

WizHook.Key = 51488399   'It's undocumented magic, just go with it.

Sample Function

I will be writing additional articles covering the WizHook object, but for now, I'll repost this handy sample from the MSDN forums to whet your appetite:

Public Function GetTextLength(pCtrl As Control, ByVal str As String, _
        Optional ByVal Height As Boolean = False)
    Dim lx As Long, ly As Long
    ' Initialize WizHook
    WizHook.Key = 51488399
    ' Populate the variables lx and ly with the width and height of the
    ' string in twips, according to the font settings of the control
    WizHook.TwipsFromFont pCtrl.FontName, pCtrl.FontSize, pCtrl.FontWeight, _
                          pCtrl.FontItalic, pCtrl.FontUnderline, 0, _
                          str, 0, lx, ly
    If Not Height Then
        GetTextLength = lx
    Else
        GetTextLength = ly
    End If
End Function

The function can be used like this to AutoFit an Access form/report control:

Public Sub AutoFit(ctl As Control)
    Dim lngWidth As Long
    lngWidth = GetTextLength(ctl, ctl.Value)
    ctl.Width = lngWidth + 40   '40: horizontal buffer; may need adjusting
End Sub

Image by Franck Barske from Pixabay

UPDATE [2022-10-28]: Added German-language link to Thomas Moeller's website.