Public ChildHwnd As String '缓存子窗体控件句柄
'系统等待, 暂不执行下一语句
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'发送消息
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'主要用来遍历子窗体和子控件句柄
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
'获取控件类型
Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
'调用 EnumChidWindows 函数开始遍历指定窗口的子窗口(控件). 第一个参数即指定窗口的句柄, 第二个参数为所需回调函数的地址(AddressOf操作符获得), 第三个参数不用管...
EnumChildWindows Me.hWnd, AddressOf EnumChildProc, ByVal 0&
'这是一个回调函数, 必须放在模块中. 用来遍历指定窗口的子窗口(控件). 这里参数中的 hWnd 即为子窗口(控件)句柄
Public Function EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
    ChildHwnd = ChildHwnd & "," & hWnd
    EnumChildProc = 1
End Function
' 函数: FGetClassName
vb 字符串转数组' 功能: 返回指定窗口中的类型
' 参数: hWnd 指定窗口的句柄
' 返回: 指定窗口的类型
Public Function FGetClassName(hWnd As Long) As String
Dim ClassName As String
Dim Ret As Long
   
    '填充缓冲(如果填充太小返回会不完整).
    ClassName = Space(256)
    '调用 GetClassName 函数, 返回值为类型名的实际长度.
    Ret = GetClassName(hWnd, ClassName, 256)
   
    '函数返回类型. Ret 为上一步所得到的类型名的实际长度.
    FGetClassName = Left(ClassName, Ret)
End Function
' 函数: GetText
' 功能: 返回指定窗口(如文本框)中的文字
' 参数: WindowHandle 指定窗口的句柄
' 返回: 指定窗口的文字
Public Function GetText(WindowHandle As Long) As String
Dim strBuffer As String '字符串缓冲
Dim Char As String '储存密码掩码以待恢复
    '填充缓冲(如果填充太小返回会不完整).
    strBuffer = Space(255)
    '发送消息 EM_GETPASSWORDCHAR(返回密码掩码) 给指定窗口. 这里返回掩码给Char(比如可能 Char=*).
    Char = SendMessage(WindowHandle, &HD2, 0, 0)
    '发送消息 EM_SETPASSWORDCHAR(设置密码掩码) 给指定窗口. 这里设置了0(Null), 即除去除密码掩码.
    PostMessage WindowHandle, &HCC, 0, 0
    '如果是Edit控件则等待消息发送成功, 即等待掩码被去除.
    If InStr("Edit", FGetClassName(WindowHandle)) And Char <> "0" Then Sleep (10)
    '发送消息 WM_GETTEXT(返回所含文字) 给指定窗口. 这里得到Edit控件的文字, 即密码. 注意"ByVal", 如果少这个则VB崩溃.
    SendMessage WindowHandle, &HD, 255, ByVal strBuffer
    '发送消息 EM_SETPASSWORDCHAR(设置密码掩码) 给指定窗口. 这里设置为Char, 即恢复原先掩码.
    PostMessage WindowHandle, &HCC, ByVal Char, 0
   
    '函数返回所得文字(密码), 之所以要用Trim去空格是因为第一步中用空格填充了255个字符.
    GetText = Trim(strBuffer)
End Function
Public ChildHwnd As String
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'发送消息
      Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
      Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      '主要用来遍历子窗体和子控件句柄
      Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
      '控件类型
      Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
   
'开始遍历
EnumChildWindows me.hWnd, AddressOf EnumChildProc, ByVal 0&
'遍历子窗体控件句柄,这个函数必须用在模块中
Public Function EnumChildProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
ChildHwnd = ChildHwnd & "," & hWnd
      EnumChildProc = 1 
End Function
'由于上面这个函数每次调用都会得到下一个子窗体(控件)的句柄,并赋值给hWnd,实际使用中,我把所有子句柄存放在ChildHwnd字符串中,遍历完毕,再
'Dim AllHwnd() As String
'去除多余的无效字符
'ChildHwnd = Mid(ChildHwnd, 2)
'转换成数组
'AllHwnd = Split(ChildHwnd, ",")
'获得所有子句柄后,需要获取其控件类型
'查看窗体/控件类型
Public Function FGetClassName(hWnd As Long) As String
      Dim ClassName As String
      Dim Ret As Long
      '为类名设置缓存区大小
      ClassName = Space(256)
      '得到GETCLASSNAME返回值
      Ret = GetClassName(hWnd, ClassName, 256)
      FGetClassName = Left(ClassName, Ret)
End Function
'直接sendmessage 就可以得到控件中的内容了,对于某些可能有passwordchar属性的控件,需要先sendmessage查看其passwordchar属性,再 postmessage取消该属性,一定时间延迟后(一定要),再sendmessage读取内容,再sendmessage恢复passwordchar属性
Public Function GetText(WindowHandle As Long) As String
      Dim strBuffer As String, Char As String, lngTextLength As Long

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。