I am writing a program to control other applications that are running. Essentially an automation UI program. I am using a combination of AutoIt and basic windows API calls (sendcommand). I am able to do almost everything that I need (read/write textboxes, labels, click buttons/checkboxes/radiobuttons) However, I cannot seem to work out how to determine if a radiobutton or checkbox is checked or not. I have searched and searched the web and cannot come up with an answer. I believe the Sendmessage(hWnd,BM_GetChecked,0,0) command will work with older Win32 controls, but only returns 0 with newer .NET controls. People talk about using Iaccessible interface, but I cannot figure out how to make it work, nor do I have the code for the other applications if I have to make changes there. So, I would greatly appreciate it if someone could put together a snippet of code that could identify if a checkbox/radiobutton is checked or not on a different application.
The following is what I have to determine the hWnd of the control and try to sendmessage to it. I can sendmessage(hWnd,BM_Click,0,0) just fine to click on it, but I cannot not determine if checked already.
I am not stuck on doing it this way at all if someone can show me another way to do it...
Public Class Form1 Declare Auto Function SendMessage2 Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Int32 Private Declare Auto Function FindWindow Lib "user32.dll" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String _ ) As IntPtr Private Declare Auto Function FindWindowEx Lib "user32.dll" ( _ ByVal hwndParent As IntPtr, _ ByVal hwndChildAfter As IntPtr, _ ByVal lpszClass As String, _ ByVal lpszWindow As String _ ) As IntPtr Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim returnvalue As Integer Dim hWnd As IntPtr = FindWindow(vbNullString, "TestFormName") If hWnd.Equals(IntPtr.Zero) Then MessageBox.Show("no window") Return End If Dim hWndButton As IntPtr = _ FindWindowEx(hWnd, IntPtr.Zero, "WindowsForms10.BUTTON.app.0.2bf8098_r20_ad1", "RadioButton1") If hWndButton.Equals(IntPtr.Zero) Then MessageBox.Show("no control") Return End If 'once you have the right handle, try to send bm_click to see if checked returnvalue = SendMessage2(hWndButton, BM_GETCHECK, 0, 0) MessageBox.Show(CStr(returnvalue)) End Sub end class