【发布时间】:2015-09-09 16:12:01
【问题描述】:
构建一个工具来自动与海量数据库的前端界面交互。通过在选中和未选中之间切换复选框并点击保存来修改许多字段。无法直接进入数据库本身进行更新或查看设置,一切都必须通过前端应用程序。
选中该框一点也不麻烦,只是一个简单的Sendmessage(hndl, BM_CLICK, 0, 0),但问题是这只是切换框。我需要确保它被选中,如果我在一个已经选中的框上发送点击,它将取消选中它。
我尝试使用BM_SETCHECK 强制检查状态,但没有效果。我还尝试使用BM_GETCHECK 和BM_GETSTATE 在发送我的BM_CLICK 命令之前判断该框是否已被选中。不幸的是,我创建的用于检查状态的函数总是返回 false。
Imports System.Runtime.InteropServices
Imports vb = Microsoft.VisualBasic
Public Class ucCheckBoxChecker
Private Const BM_CLICK As Integer = &HF5
Private Const BST_CHECKED As Integer = &H1
Private Const BM_GETSTATE As Integer = &HF2
Private Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, _
ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
Private Declare Function SendMessageA Lib "user32" Alias "SendMessageA" _
(ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As String) As Integer
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim hndlCheckBox As Integer = FindWindowEx(hndlParent, 0, "WindowsForms10.BUTTON.app.0.141b42a_r11_ad1", vbNullString)
If IsChecked(hndlCheckBox) = False Then SendMessageA(hndlCheckBox, BM_CLICK, 0, 0)
End Sub
Public Function IsChecked(ByVal hWnd As Integer) As Boolean
Dim intHndlVal As Integer
intHndlVal = SendMessage(hWnd, BM_GETSTATE, 0, 0)
Debug.Print(intHndlVal)
IsChecked = ((intHndlVal And BST_CHECKED) = BST_CHECKED)
End Function
End Class
我已验证句柄是正确的,但无论我尝试什么,我似乎都无法将 intHndlVal 设为 0 以外的任何值。
【问题讨论】:
标签: vb.net checkbox sendmessage