API函数 EnumWindows, FindWindow, EnumChildWindows联合使用定位到文本框,然后SendMessage函数发送EM_SETSEL设置文本内容或者发送WM_PASTE消息复制剪贴版中的内容

解决方案 »

  1.   

    用API:FindWindowdim Phwnd as long
    phwnd=findwindow("类名","窗口标题")
    其中可以不填其中一个或都不填。phwnd=0表示无该窗体。否则phwnd=句柄
    然后用FindWindowEx函数
    '--------------
    具体的给你个取得QQ发送框数据,并发送文本的代码
    '-------------Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Const EM_GETLINECOUNT = &HBA
    Private Const WM_GETTEXT = &HD
    Private Const WM_SETTEXT = &HC
    Private Const WM_GETTEXTLENGTH = &HE
    Dim hd As Long, chd As Long
    Private Sub Command1_Click()
    Dim tt$
    BringWindowToTop hd
    SetForegroundWindow hd
    tt = Text1.Text
    SendMessage chd, WM_SETTEXT, 0, ByVal tt
    SendKeys "%S"
    End SubPrivate Sub Timer1_Timer()
    hd = FindWindow(vbNullString, "发送消息")
    If hd <> 0 Then
    chd = FindWindowEx(hd, 0, "EDIT", vbNullString)
    If SendMessage(chd, EM_GETLINECOUNT, 0, 0) <> 0 Then Me.Caption = "QQ SendBox hWnd = " & CStr(chd)
    Text1.Enabled = True: Command1.Enabled = True
    Text2.Text = GetText(chd)
    Else
    Me.Caption = "Can't find QQ SendBox"
    Text1.Enabled = False: Command1.Enabled = False
    Text2.Text = ""
    End If
    End Sub
    Public Function GetText(ByVal hWndNow As Long) As String '获取文本的子程序
    On Error Resume Next
    Dim bArr() As Byte, bArr2() As Byte
    hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
    If hLength > 0 Then
    ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
    Call CopyMemory(bArr(0), hLength, 2)
    Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
    Call CopyMemory(bArr2(0), bArr(0), hLength)
    GetText = StrConv(bArr2, vbUnicode)
    Else
    GetText = ""
    End If
    End Function'--------------------
    需要一个Command,一个timer
      

  2.   

    读取鼠标位置
    Public Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
    读取指定置窗口的句柄
    Public Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
    设置鼠标位置
    Public Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Long, ByVal y As Long) As Long
    '--活动窗口的句柄
    Public Declare Function GetForegroundWindow Lib "user32" Alias "GetForegroundWindow" () As Long
    ‘查找指定窗口,返回句柄
    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    读取窗口内的文本
    Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    '发WM_GETTEXT消息函数
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Sub RtlMoveMemory Lib "kernel32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
    Public hLength As Long
    Public bArr() As Byte, bArr2() As Byte
    Public Const WM_GETTEXT = &HD
    Public Const WM_GETTEXTLENGTH = &HE
    Public Type POINTAPI
        X As Long
        Y As Long
    End TypePublic Type RECT
      Left As Long
      Top As Long
      Right As Long
      Bottom As Long
    End TypePrivate Sub Timer1_Timer()
      Dim strCN As String * 200
      Dim i As Long, strCS As String
      hNow222 = GetForegroundWindow '--活动窗口的句柄
      hResult = GetCursorPos(Pos)
      hNow = WindowFromPoint(Pos.X, Pos.Y)
      hSet = SetCursorPos(Pos.X, Pos.Y)
      '防止获取自身文本
      If hNow <> Text1.hwnd Then
         Text1.Text = "【 句柄:" & hNow &" 】" & _
         vbCrLf & "内容:  " & GetText(hNow)
      End If  DoEvents
    End Sub
      

  3.   

    to wjq(b_wind) 
    在command_click中的这两个函数有什么用?
    BringWindowToTop hd
    SetForegroundWindow hd
      

  4.   

    to wjq(b_wind) 
    如果这个窗体里有多个文本框,如何顺序获得每个文本框的句柄并对其操作?
      

  5.   

    EnumWindows, FindWindow, EnumChildWindows
      

  6.   

    to zyb_8022(紫光) 
    BringWindowToTop 
    SetForegroundWindow 
    的作用都是使后面参数句柄的窗体取得焦点,即成为活动窗体。作用相同,也懒得去调一个了
    '-------------
    可以像 Ranma_True(乱马1/2(真)) 说的,枚举。但如果是你要修改的窗口是固定的,那么,你可以自己使用FindWindowEx函数,试,一层一层下去,直到,找到你需要的文本框。用法:
    Hwnd=FindWindowEx(父窗口句柄,上一个找到的(如文本框的)句柄,类(如:文本框:EDIT),类(可省,设为:VbNullstring))
      

  7.   

    to wjq(b_wind)
    怎么找啊?我用其它程序看了一下该窗体和该窗体上文本框的句柄和类名,这个窗体上所有文本控件的类名都是edit,并且文本框内容为空时,怎么找到哪个是我想要的?具体意思是这样的,有个数据库中的各字段对应各窗体中的各文本框,怎么样把数据库中的各字段的内容放在相应的文本框中?因为是要把内容放入到另外一个不可修改的应用程序中去,所以不能用ado直接操作
    又如何取得另外一个应用程序中toolbar中各按钮,并能控制执行想要执行的某个命令的按钮
    请指教
      

  8.   

    to wjq(b_wind)
    我现在用的是枚举的方法,可是用此方法还是无法知道当前得到的是不是我想要的那个文本框的内容
      

  9.   

    有个API函数叫getwindowtext可以获得句柄对应控件的文字呀
      

  10.   

    '用以下函数可以取得该文本框的文字,以进行判断。如果他们都是空的Goto Pro2
    Public Function GetText(ByVal hWndNow As Long) As String '获取文本的子程序
    On Error Resume Next
    Dim bArr() As Byte, bArr2() As Byte
    hLength = SendMessage(hWndNow, WM_GETTEXTLENGTH, 0, 0)
    If hLength > 0 Then
    ReDim bArr(hLength + 1) As Byte, bArr2(hLength - 1) As Byte
    Call CopyMemory(bArr(0), hLength, 2)
    Call SendMessage(hWndNow, WM_GETTEXT, hLength + 1, bArr(0))
    Call CopyMemory(bArr2(0), bArr(0), hLength)
    GetText = StrConv(bArr2, vbUnicode)
    Else
    GetText = ""
    End If
    End Function
    'Pro2:
    dim tt$
    tt="设置点文字"'发送到你找的文本框里,这样识别。由于,他们的顺序是不变的,用这种方法确定好FindWindowEx找到文本框的顺序,就可以了
    SendMessage chd, WM_SETTEXT, 0, ByVal tt
      

  11.   

    “又如何取得另外一个应用程序中toolbar中各按钮,并能控制执行想要执行的某个命令的按钮
    请指教“我觉得可以先用Spy++看到他与窗体的从属关系(下属几层),然后用FindWindowEx区的其句柄。再用SendMessage发送点击消息。但是我不知道,如何点其中的某个按钮。或者可以这样,先取得toolbar句柄,用GetWindowRect取得位置,用API移动鼠标到那个按钮,然后模拟鼠标点击
      

  12.   

    to wjq(b_wind) 
    最后再问一次,谢谢
    那你知不知道模拟鼠标点击是哪个消息?另外为什么从文本框中取得的字符串无法与其它字符串变量相比较?比如从文本框中取得的字符串是"ABC",另一个字符串变量是A="ABC",为什么它们哪个不相等?
      

  13.   

    to wjq(b_wind) 
    最后再问一次,谢谢
    那你知不知道模拟鼠标点击是哪个消息?另外为什么从文本框中取得的字符串无法与其它字符串变量相比较?比如从文本框中取得的字符串是"ABC",另一个字符串变量是A="ABC",为什么它们哪个不相等?怎么比较两者才是相等的?
      

  14.   

    非常抱歉,我不知道模拟Click是哪个消息,但可以告诉你,模拟MouseDown.
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const WM_LBUTTONDOWN = &H201
    Private Const MK_LBUTTON = &H1
    '------------
    SendMessage Command2.hwnd, WM_MOUSEACTIVATE, MK_LBUTTON, 20020
    其中20020是鼠标点击位置格式为x0y.
    '------------------------
    因为,你使用取得字符串,需要先给变量设置缓冲区,用CHR(0) 或 空格。大多数用前者,这时就要使用instr函数取得第一个chr(0)所在,并把后面的chr(0)全部去掉。这样才能使他与你的变量相等。'------------------------
    这两天CSDN那么不稳定。开这个页面用了半个小时。你可以e-mail我。给你留言了。