Recently, I turned to Windows messaging to manipulate certain dialogs by simulating button clicks programmatically. I looked through my API references and found only the WM_LBUTTONDOWN and WM_LBUTTONUP messages. I couldn’t get them to work until I found, on the MSDN Web site, a message that’s not documented in the API text that comes with VB?BM_CLICK = &HF5. You set lParam and wParam both to zero to use this message. It works perfectly when it’s sent directly to the button. SendMessage is a synchronous call. If the button you want to click might take some time to process its work, and you’d rather make an asynchronous click, use PostMessage instead. This sample shows how to use the BM_CLICK message. Paste this code into a new form, with two command buttons, one option button, and one checkbox:
Option ExplicitPrivate Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hWnd As Long, ByVal wMsg _ As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Declare Function PostMessage Lib "user32" Alias _ "PostMessageA" (ByVal hWnd As Long, ByVal wMsg _ As Long, ByVal wParam As Long, ByVal lParam As Long) _ As LongPrivate Const BM_CLICK = &HF5Private Sub Check1_Click() Debug.Print " Check1_Click"End SubPrivate Sub Command1_Click() Debug.Print " Command1_Click"End SubPrivate Sub Command2_Click() Debug.Print "Entering Command2_Click" Call SendMessage(Check1.hWnd, BM_CLICK, 0, ByVal 0&) Call SendMessage(Option1.hWnd, BM_CLICK, 0, ByVal 0&) Call SendMessage(Command1.hWnd, BM_CLICK, 0, ByVal 0&) Debug.Print "Exiting Command2_Click"End SubPrivate Sub Option1_Click() Debug.Print " Option1_Click"End Sub
The BM_CLICK message works on any button-class control. This includes option buttons and checkboxes.