vb.net枚举窗体查找指定窗体

有的时候想要获取别的程序的句柄,所以,但是很多时候坐标名称等都是不固定的,而且有的窗体属于非激活状态或最小化,这样会比较难获取,所以需要枚举所有窗体出来进行查找。
上代码

  Public Class 窗体
        Public Property 窗口句柄 As Integer
        Public Property 窗口标题 As String = ""
        Public Property 窗口类名 As String = ""
        Public Overrides Function ToString() As String
            Return 窗口句柄.ToString & Space(4) & 窗口标题 & Space(4) & 窗口类名

        End Function
    End Class
    Public Class 枚举窗体
#Region "WinApi"
        <DllImport("user32.dll", setlasterror:=True)>
        Public Shared Function GetDesktopWindow() As Integer '获取桌面句柄

        End Function
        <DllImport("user32.dll", setlasterror:=True)>
        Private Shared Function EnumChildWindows(ByVal hWndParent As Integer, ByVal lpEnumFunc As Integer, ByVal lParam As Integer) As Integer

        End Function
        <DllImport("user32.dll")>
        Public Shared Function EnumChildWindows(ByVal hWndParent As Integer, ByVal lpEnumFunc As EnumChild, ByVal lParam As Integer) As Integer

        End Function
        '获取类名
        <DllImport("user32.dll", SetLastError:=True)>
        Public Shared Function GetClassName(ByVal hwnd As Integer, ByVal lpClassName As StringBuilder, ByVal nMaxCount As Integer) As Integer

        End Function
        '获取窗体标题
        <DllImport("user32.dll", EntryPoint:="GetWindowText", setlasterror:=True)>
        Public Shared Function GetWindowText(ByVal hwnd As Integer, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer

        End Function
        <DllImport("user32.dll", EntryPoint:="GetWindowText", setlasterror:=True)>
        Public Shared Function GetWindowText(ByVal hwnd As Integer, ByVal lpString As IntPtr, ByVal cch As Integer) As Integer

        End Function
   

        <DllImport("user32.dll", EntryPoint:="EnumWindows&", setlasterror:=True)>
        Public Shared Function EnumWindows&(ByVal lpEnumFunc As Integer, ByVal lParam As Integer)

        End Function
#End Region

        Public Delegate Function EnumChild(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer
        Dim tempfrm As 窗体
        Dim flist As List(Of 窗体)
        Public Function 枚举桌面所有窗体() As List(Of 窗体)
            flist = New List(Of 窗体)
            Dim enumfuc As New EnumChild(AddressOf EnumChildProc)
            Dim 函数指针 As IntPtr = Marshal.GetFunctionPointerForDelegate(enumfuc)
            EnumChildWindows(GetDesktopWindow, 函数指针, 0)

            Marshal.Release(函数指针)
            Return flist

        End Function
        Public Function 枚举当前窗体所有子窗体(hwmd As Integer) As List(Of 窗体)
            flist = New List(Of 窗体)
            Dim enumfuc As New EnumChild(AddressOf EnumChildProc)
            Dim 函数指针 As IntPtr = Marshal.GetFunctionPointerForDelegate(enumfuc)
            EnumChildWindows(hwmd, 函数指针, 0) 

            Marshal.Release(函数指针) 
            Return flist

        End Function
        '枚举窗体的回调函数
        Function EnumChildProc(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer

            Dim Fcn As New StringBuilder(50)
            Dim ftitle As New StringBuilder(50)
            GetWindowText(hwnd, ftitle, ftitle.Capacity) '获取窗体标题名称

            GetClassName(hwnd, Fcn, Fcn.Capacity) '获取类名


            tempfrm = New 窗体 With {.窗口句柄 = hwnd, .窗口标题 = ftitle.ToString, .窗口类名 = Fcn.ToString}
            flist.Add(tempfrm)
            Fcn = Nothing
            ftitle = Nothing
            GC.Collect()
            Return 1
        End Function
    End Class

我将这些操作封装到类中,只需要调用即可返回相应的信息,这样可以很便捷的找出相应的窗体,你也可以通过递归的操作进行子窗体的枚举。代码放这还不会用那就对不起我了。哈哈

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值