有的时候想要获取别的程序的句柄,所以,但是很多时候坐标名称等都是不固定的,而且有的窗体属于非激活状态或最小化,这样会比较难获取,所以需要枚举所有窗体出来进行查找。
上代码
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
我将这些操作封装到类中,只需要调用即可返回相应的信息,这样可以很便捷的找出相应的窗体,你也可以通过递归的操作进行子窗体的枚举。代码放这还不会用那就对不起我了。哈哈