【问题标题】:Viewing checkedstatus of checkbox in external application VS 2012在外部应用程序 VS 2012 中查看复选框的检查状态
【发布时间】:2015-09-09 16:12:01
【问题描述】:

构建一个工具来自动与海量数据库的前端界面交互。通过在选中和未选中之间切换复选框并点击保存来修改许多字段。无法直接进入数据库本身进行更新或查看设置,一切都必须通过前端应用程序。

选中该框一点也不麻烦,只是一个简单的Sendmessage(hndl, BM_CLICK, 0, 0),但问题是这只是切换框。我需要确保它被选中,如果我在一个已经选中的框上发送点击,它将取消选中它。

我尝试使用BM_SETCHECK 强制检查状态,但没有效果。我还尝试使用BM_GETCHECKBM_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


    【解决方案1】:

    您可以尝试使用 AutomationElement 类。

    https://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement(v=vs.110).aspx

    https://msdn.microsoft.com/en-us/library/ms750424(v=vs.110).aspx

    下面的代码是c#,但您应该可以使用在线代码转换器转换为vb .net。我从上面列出的网站之一中获取了 IsElementToggledOn 代码。

    AutomationElement element = AutomationElement.FromHandle( hwnd );
    
    /// <summary> 
    /// Gets the toggle state of an element in the target application. 
    /// </summary> 
    /// <param name="element">The target element.</param>
    private bool IsElementToggledOn(AutomationElement element)
    {
        if (element == null)
        {
            // TODO: Invalid parameter error handling. 
            return false;
        }
    
        Object objPattern;
        TogglePattern togPattern;
        if (true == element.TryGetCurrentPattern(TogglePattern.Pattern, out objPattern))
        {
            togPattern = objPattern as TogglePattern;
            return togPattern.Current.ToggleState == ToggleState.On;
        }
        // TODO: Object doesn't support TogglePattern error handling. 
        return false;
    }
    

    【讨论】:

    • 非常感谢。这需要一些工作(以及大量的谷歌搜索),但 AutomationElement 方法似乎正在工作。实际上会返回并重写一些 API 命令以使用 AutomationElements,因为它是与外部应用程序交互的更通用的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多