试了多种方法都无效.什么FindWindowEx,GetCurrPos+WindowFromPoint
得到的句柄并不是这个输入框的!
但用SPY++又能得到正确句柄.真是奇怪.环境:WIN2K SP4

解决方案 »

  1.   

    从顶层窗口到你要找的窗口的类名分别是:HH Parent
    HH Child
    SysTabControl32
    #32770
    ComboBox
    Edit
      

  2.   

    是的
    但是只有切换到“搜索”页
    那个Edit才会创建
      

  3.   

    既:
    如果没切换到“搜索”页
    那个Edit不存在
      

  4.   

    '已切换到“搜索”页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 LongPrivate Sub Command1_Click()
        Dim hDlg As Long
        Dim hWndChild As Long
        Dim hWnd As Long
        hDlg = FindWindow("HH Parent", vbNullString)
        
        'hWnd = FindWindowEx(hDlg, 0, "HH Child", vbNullString)'由于存在同类名控件,所以无法区分
        hWndChild = 0
        Do
            hWndChild = FindWindowEx(hDlg, hWndChild, "HH Child", vbNullString)
            Debug.Print hWndChild
            If hWndChild = 0 Then Exit Do
            hWnd = FindWindowEx(hWndChild, 0, "SysTabControl32", vbNullString)
            hWnd = FindWindowEx(hWnd, 0, "#32770", vbNullString)
            hWnd = FindWindowEx(hWnd, 0, "ComboBox", vbNullString)
            hWnd = FindWindowEx(hWnd, 0, "Edit", vbNullString)
            If hWnd <> 0 Then Exit Do
        Loop
        MsgBox hWnd'找到了!
        
    End Sub
      

  5.   

    to zyl910(910:分儿,我又来了!):
    我怎么没试成功?已经切换到搜索页了。
      

  6.   

    Option Explicit
    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 putFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) 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 SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Declare Function GetFocus Lib "user32" () As Long
    Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
    Private Const WM_SETTEXT = &HCPrivate Sub Command1_Click()
        Dim s As String
        s = "VB技巧" '换成你要查找的窗口标题
        Dim mhwnd As Long
        mhwnd = FindWindow("HH Parent", s)
        '显示找到的窗口
        ShowWindow mhwnd, vbNormalFocus
        '切换到搜索页
        SendKeys "%S", 1
        Dim texthwnd As Long
        '使编辑框获得输入焦点
        SendKeys "%w"
        '获得编辑框的句柄,texthwnd即为所求
        texthwnd = GetFocus
        '设置编辑框的内容
        SendMessage texthwnd, WM_SETTEXT, 0&, ByVal "this is test"
        '以下程序没大用,验证用的,获得编辑框的类名
        Dim ss As String * 256
        GetClassName texthwnd, ss, 256
        Debug.Print Left(ss, InStr(1, ss, Chr(0)) - 1)
        
        
    End Sub
      

  7.   

    说明,我上面的程序中窗体上只能有一个按钮(如果有其它控件的话,要临时改变他们的Enabled属性)
      

  8.   

    rainstormmaster(暴风雨 v2.0)的方法很另类,呵呵。   :)
      

  9.   

    http://expert.csdn.net/Expert/topic/2682/2682316.xml?temp=.9793665真抱歉,KeyWord的Edit框记成Search的Edit框了.
    我真正想知道的是如何得到KeyWord的EDIT框.当然,此贴的分我还是会给的.但结完了之后想必各位都不会再看贴子了.还是呆会再结比较好.嘿嘿~
      

  10.   

    幸亏昨天这题没给200分.不然今天就没可用分发另一贴了.好久没从正规方式的网站登陆CSDN了,可用分没有加.可怜!!!
      

  11.   

    没看出有什么本质区别:
    Option ExplicitPrivate 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 putFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) 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 SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Declare Function GetFocus Lib "user32" () As Long
    Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long
    Private Const WM_SETTEXT = &HCPrivate Sub Command1_Click()
        Dim s As String
        s = "VB技巧" '换成你要查找的窗口标题
        Dim mhwnd As Long
        mhwnd = FindWindow("HH Parent", s)
        '显示找到的窗口
        ShowWindow mhwnd, vbNormalFocus
        '切换到索引页
        SendKeys "%N", 1
        Dim texthwnd As Long
        '使编辑框获得输入焦点
        SendKeys "%w"
        '获得编辑框的句柄,texthwnd即为所求
        texthwnd = GetFocus
        '设置编辑框的内容
        SendMessage texthwnd, WM_SETTEXT, 0&, ByVal "this is test"
        '以下程序没大用,验证用的,获得编辑框的类名
        Dim ss As String * 256
        GetClassName texthwnd, ss, 256
        Debug.Print Left(ss, InStr(1, ss, Chr(0)) - 1)
        
        
    End Sub
    窗体上只能有一个按钮(如果有其它控件的话,要临时改变他们的Enabled属性)
      

  12.   

    不行的GetFocus()只对目标线程有效
      

  13.   

    //GetFocus()只对目标线程有效根据微软的解释,上面的结论应该是正确的(GetFocus:如果调用GetFocus函数的线程没有具有焦点的窗口,GetFocus将返回NULL。在Win16下,该函数将返回具有焦点的窗口,而无论哪个任务拥有该窗口。)可是,我在win2k下确实调用成功了(希望有win2k的朋友帮助测试一下(窗体上只有一个按钮,代码见上面的帖子),不会是我的win2k中邪了吧)事实上,调用GetFocus得到其他应用程序的键盘光标所在窗口句柄,一般需要调用attachThreadInput()函数AttachThreadInput()函数的原形如下: 
    BOOL AttachThreadInput( 
    DWORD idAttach, // 需要附加的线程ID 
    DWORD idAttachTo, // 附加到的线程ID 
    BOOL fAttach // true 附加 false 取消 
    ); 可是问题是,我没用attachThreadInput就可以通过GetFocus获得其它线程的窗口句柄,奇怪!不解!
      

  14.   

    Win98下调试通过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 GetDlgCtrlID Lib "user32.dll" (ByVal hwnd As Long) As LongPrivate Declare Function GetFocus Lib "user32" () As LongPrivate 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 As Long = &H201
    Private Const WM_LBUTTONUP As Long = &H202
    Private Const MK_LBUTTON As Long = &H1Private Const WM_SETTEXT = &HC
    Private Sub Command1_Click()
        Dim hWndMain As Long
        Dim hWndChild As Long
        Dim hWndTab As Long
        Dim hWndEdit As Long
        
        '得到主窗体的句柄
        hWndMain = FindWindow("HH Parent", vbNullString)
        'Debug.Print "Main:"; hWndMain
        
        '得到Tab控件的句柄
        hWndChild = 0
        Do
            hWndChild = FindWindowEx(hWndMain, hWndChild, "HH Child", vbNullString)
            If hWndChild = 0 Then Exit Do
            hWndTab = FindWindowEx(hWndChild, 0, "SysTabControl32", vbNullString)
            If hWndTab <> 0 Then Exit Do
        Loop
        'Debug.Print "Tab:"; hWndTab
        
        '切换到“索引”页
        Call SendMessage(hWndTab, WM_LBUTTONDOWN, MK_LBUTTON, ByVal &H80050) '&H80050是坐标(80,8)
        
        '得到索引文本框的句柄
        hWndEdit = FindWindowEx(hWndChild, 0, "Edit", vbNullString)
        'Debug.Print "Edit:"; hWndEdit
        
        '设置文字
        Call SendMessage(hWndEdit, WM_SETTEXT, 0, ByVal "这是“索引”文本框")
        
    End Sub