我用ShellExecute调用了Windows的一个应用程序,请问如何获得(捕捉)此窗口中某一个控件的句柄,并将焦点聚集在上边呢(关键是这一点)?大侠们能不能给写一个例子?我知道可以根据窗体的标题来取得窗体的HWND,可是如何做呢?比如:用ShellExecute调去了“我的电脑”的窗口,其中“地址栏”的句柄是656520(每次句柄都是不同的,我是用工具查出来的),然后把让这个Combo获得焦点。我搜索了以前的帖子,并试验了一些。可是没有成功。郁闷。:)呵呵。感谢大侠的帮助!!

解决方案 »

  1.   

    以后写过盗取QQ密码的小程序,用的就是这方法(我也是看别人的代码写的哦),枚举所有的窗体,具体代码我得找找,N年前的事了!
      

  2.   

    呵呵。不过我不是在写DaoQQ的程序。我主要的目的是如何实现这种方法。做了好几个东东,都要用到。5555555555。:(
      

  3.   

    spark_li(晕忽忽(恶人谷:通讯连长) 朋友: 不只是一个控件,必须取得句柄来操作。您好像没有看懂我的意思。:)
      

  4.   

    取得窗体句柄Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Sub Form_Load()
    Dim hw As Long
    hw = FindWindow(vbNullString, "我的电脑")
    MsgBox hw
    End Sub
      

  5.   

    恩!!谢谢cnhgj(黄桂佳 → 吃软不吃硬)!!然后呢?取得句柄后呢?
    我想获得其下的Combo的句柄,并且把焦点给它~如何做?
      

  6.   

    哦。。还要获得蕉点啊。。没用过。。不过可以试试用SetForegroundWindow这个API,将焦点放在指定的窗体,然后用sendkeys "{tab}"
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Sub Command1_Click()
    Dim hw As Long
    hw = FindWindow(vbNullString, "我的电脑")
    SetForegroundWindow (hw)
    SendKeys "{tab}"
    SendKeys "{tab}"
    SendKeys "{tab}"
    SendKeys "{tab}"
    End Sub先打开我的电脑,然后运行程序,然后你会看到焦点定在地址栏那里,我在win2000,vb6.0下通过
      

  7.   

    '我刚在XP下调出来的,我这没问题,你试试吧
    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 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 ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Const WM_SETFOCUS = &H7Private Sub Command1_Click()
    Dim Handle As Long, topHandle As Long
    Handle = FindWindow("CabinetWClass", "我的电脑")   ' 只能是我的电脑,资源管理器不行
    topHandle = Handle
    Handle = FindWindowEx(Handle, 0&, "WorkerW", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ReBarWindow32", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ComboBoxEx32", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ComboBox", vbNullString)
    Debug.Print Handle  ' 这个Handle就是我的电脑的Combo的句柄了
    ' 下面两句可能能用一个SendMessage代替,你查查吧,其功能是让我的电脑窗口为当前窗口
    ShowWindow topHandle, 0
    ShowWindow topHandle, 5SendMessage Handle, WM_SETFOCUS, 0, 0    ' 让那个Combo获得焦点
    End Sub
      

  8.   

    呵呵。cnhgj(黄桂佳 → 吃软不吃硬) 朋友:您的方法也很好,不过有点投机取巧~呵呵,本来我是想取得子控件的句柄,然后用Api的Setfocus操作的。呵呵。要是不太好做得话,我就用cnhgj您的方法,非常感谢你!!!
      

  9.   

    '我刚在XP下调出来的,我这没问题,你试试吧
    '改进了一下,那两个ShowWindow换了一下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 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 ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Const WM_SETFOCUS = &H7Private Sub Command1_Click()
    Dim Handle As Long, topHandle As Long
    Handle = FindWindow("CabinetWClass", "我的电脑")   ' 只能是我的电脑,资源管理器不行
    topHandle = Handle
    Handle = FindWindowEx(Handle, 0&, "WorkerW", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ReBarWindow32", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ComboBoxEx32", vbNullString)
    Handle = FindWindowEx(Handle, 0&, "ComboBox", vbNullString)
    Debug.Print Handle  ' 这个Handle就是我的电脑的Combo的句柄了
    SetForegroundWindow topHandle
    SendMessage Handle, WM_SETFOCUS, 0, 0    ' 让那个Combo获得焦点
    End Sub
      

  10.   

    OK!!goodname008(卢培培,想学好VB) 朋友:我正在看您的代码并且试验。  :)非常感谢你!!!
      

  11.   

    晕~解决了~呵呵。
    我是标准的傻X!我太弱智了,我怎么没想出来?        cnhgj(黄桂佳 → 吃软不吃硬) ,goodname008(卢培培,想学好VB) 两位仁兄(仁妹),能不能告诉我你们的QQ?我的是 87266872 。还是CSDN高人多的。向VB高手学习!
      

  12.   

    解决了~揭帖!!!再次感谢!
       cnhgj(黄桂佳 → 吃软不吃硬) ,goodname008(卢培培,想学好VB) 两位仁兄!!!只是每人25分有些少。 因为我确实没分了。十分对不住阿!呵呵
      

  13.   

    我不要。。我的办法不是那么好,把分给goodname008(卢培培,想学好VB)
      

  14.   

    呵呵。
    30分:20分=goodname008(卢培培,想学好VB) :cnhgj(黄桂佳 → 吃软不吃硬)这样好了。:)
      

  15.   

    我也在试~
    可以告诉我怎样关闭这个程序吗?
    用postMessages
      

  16.   

    shell的基础知识,盼望讲解!!!!!!!!!!!