如何使用 VB.Net 获取弹出消息框中包含的控件的属性

问题描述 投票:0回答:1

我正在开发一个

VB.Net
项目,其中一部分是我在显示时捕获一个弹出消息框并以某种方式处理它。 我的问题是我必须知道这个弹出窗口中包含哪些按钮(主要是它们的标题)。 这可能吗?有人可以告诉我如何做到这一点吗?如果有样品,我们将不胜感激。

谢谢。

更新: 由于我投了反对票,Ed Cottrell 告诉我这是因为没有添加与我的问题相关的任何代码。现在我有了问题的答案,所以我添加了一些代码:

我的应用程序捕获另一个 Windows 应用程序显示的弹出窗口,我使用

EnumWindows
API 来了解何时显示新的弹出窗口。

Public Declare Function EnumWindows Lib "User32.dll" (ByVal WNDENUMPROC As EnumWindowDelegate, ByVal lparam As IntPtr) As Boolean
Delegate Function EnumWindowDelegate(ByVal hWnd As IntPtr, ByVal Lparam As IntPtr) As Boolean

当我捕获这个窗口时,我使用从 EnumWindows 结果获得的句柄,并使用

EnumChildWindows
获取其子窗口(这是我正在寻找的控件,因为控件也是一种窗口):

我使用的API

    <DllImport("User32.dll")> _
    Public Function EnumChildWindows _
        (ByVal WindowHandle As IntPtr, ByVal Callback As EnumWindowProcess, _
        ByVal lParam As IntPtr) As Boolean
    End Function

    Public Delegate Function EnumWindowProcess(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean

' Get window text length signature.
Public Declare Function SendMessage _
 Lib "user32" Alias "SendMessageA" _
 (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32

' Get window text signature.
Public Declare Function SendMessage _
 Lib "user32" Alias "SendMessageA" _
 (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As StringBuilder) As Int32

ApiWindow 结构

Public Structure ApiWindow
    Public MainWindowTitle As String
    Public ClassName As String
    Public hWnd As Int32
End Structure

功能

Public Function GetChildWindows(ByVal ParentHandle As IntPtr) As IntPtr()
    Dim ChildrenList As New List(Of IntPtr)
    Dim ListHandle As GCHandle = GCHandle.Alloc(ChildrenList)
    Try
        EnumChildWindows(ParentHandle, AddressOf EnumWindow, GCHandle.ToIntPtr(ListHandle))
    Finally
        If ListHandle.IsAllocated Then ListHandle.Free()
    End Try
    Return ChildrenList.ToArray
End Function

Public Function EnumWindow(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
    Dim ChildrenList As List(Of IntPtr) = GCHandle.FromIntPtr(Parameter).Target
    If ChildrenList Is Nothing Then Throw New Exception("GCHandle Target could not be cast as List(Of IntPtr)")
    ChildrenList.Add(Handle)
    Return True
End Function

现在当我有了弹出窗口的句柄(parentHandle)时,我可以获取它的子窗口:

Dim hndls() As IntPtr = GetChildWindows(parentHandle)
Dim window As ApiWindow

For Each hnd In hndls
    window = GetWindowIdentification(hnd)
    'Add Code Here 
Next

GetWindowIdentification 的位置是:

''' <summary>
''' Build the ApiWindow object to hold information about the Window object.
''' </summary>
Public Function GetWindowIdentification(ByVal hwnd As Integer) As ApiWindow

    Const WM_GETTEXT As Int32 = &HD
    Const WM_GETTEXTLENGTH As Int32 = &HE

    Dim window As New ApiWindow()

    Dim title As New StringBuilder()

    ' Get the size of the string required to hold the window title.
    Dim size As Int32 = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)

    ' If the return is 0, there is no title.
    If size > 0 Then
        title = New StringBuilder(size + 1)

        SendMessage(hwnd, WM_GETTEXT, title.Capacity, title)
    End If

    ' Set the properties for the ApiWindow object.
    window.MainWindowTitle = title.ToString()
    window.hWnd = hwnd

    Return window

End Function
vb.net popup window
1个回答
1
投票

我在另一个网站上找到了这个答案,我想我应该分享它,以防将来有人看到这个问题:

按钮只不过是更多的窗口。你只是寻找更多的孩子 您找到的消息框窗口的窗口。你不能只是得到 来自窗口的句柄,然后尝试将其转换为 Form 对象并 期望所有属性都能工作。只是这样行不通。

© www.soinside.com 2019 - 2024. All rights reserved.