例如我打开3个计算器。
想通过枚举三个计算器的句柄。然后获得每个计算器里加号按键的句柄。
然后给三个计算器发送信息。
第一个计算器一直按1+1
第二个计算器一直按2+2
第三个计算器一直按3+3
直到计算器里的数字大于100为止。请求具体思路,如果有类似源码就再好不过了。

解决方案 »

  1.   

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As LongPrivate 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 Const WM_GETTEXT = &HD
    Private Function Getsum() As Long
       Dim tempstr As String, strlong As Long, rtn As Long
    Dim winHwnd As Long
         Dim RetVal As Long
         winHwnd = FindWindow(vbNullString, "计算器")
         If winHwnd <> 0 Then
         winHwnd1& = FindWindowEx(winHwnd&, 0&, "Edit", vbNullString)
        
         tempstr = Space(200)
        strlong = Len(tempstr)
        rtn = SendMessage(winHwnd1, WM_GETTEXT, strlong + 1, tempstr)
        tempstr = Trim(tempstr)
      Getsum = tempstr
       
         Else
             MsgBox "计算器程序没有运行?"
         End If
     End Function
    Private Sub Form_Load()
     Dim ReturnValue, I
    ReturnValue = Shell("CALC.EXE", 1) ' 运行计算器
            AppActivate ReturnValue ' 激活计算器
    Do While Getsum < 101 ' 设置
                SendKeys 1 & "{+}", True ' 按下按键给计算器
    Debug.Print Getsum
    Loop ' 将所有 I 值相加
    ReturnValue = Shell("CALC.EXE", 1)
            AppActivate ReturnValue
    Do While Getsum < 101
                SendKeys 2 & "{+}", True
    Debug.Print Getsum
    Loop
    ReturnValue = Shell("CALC.EXE", 1)
            AppActivate ReturnValue
    Do While Getsum < 101
                SendKeys 3 & "{+}", True
    Debug.Print Getsum
    LoopEnd Sub
      

  2.   

    SYSSZ(老张)
    测试了您的代码,果然是高手。如果我只是能用鼠标操作。
    我已经获得了主窗体的句柄。主窗体内有10个按钮控件(无标题)。怎么获得某个指定按钮的句柄呢。
      

  3.   

    事先用SPY++查出指定按钮的ID,程序中用GetDlgItem窗口句柄和按钮ID获得按钮句柄。
    模拟按钮点击是用SendMessage向其父窗口发WM_COMMAND消息,wParam参数的低16位给按钮ID,高16位给BN_CLICKED,lParam参数给按钮句柄(程序一般忽略)。