我用vb调用了另外一个程序QWER
vb程序中用AppActivate "**********", True '激活QWER的程序窗口
可以看到QWER程序顺利运行,其间经历1分钟左右,QWER运行结束后会
弹出一个窗口,上面有Caption,还有一个确定按钮,可以按下 回车
结束一次QWER的运行,想用Sendmessage函数,怎么用?
查了些文章,还问过一次,但是我用的不对。因为激活窗口,导致vb
下面其余的代码不运行了吗?还有那个弹出一个窗口的问题(不是QWER
原来界面中的,而是1分钟后弹出的,Sendmessage函数怎么用?)
问题2:想vb再回到自己的窗口就是vb自己,AppActivate "**********", True
好像不起作用?这次势必解决问题才给分的,感谢上次捧场的两位,这次又麻烦大家了
在做一个课题,今后还有问题上来问的,希望大家多多关照,多拿分!

解决方案 »

  1.   

    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    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, lParam As Any) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongPrivate Const WM_CLOSE = &H10
    Enum ShowTypes
        [SW_HIDE] = 0
        [SW_SHOW] = 5
        [SW_SHOWNORMAL] = 1
        [SW_SHOWMAXIMIZED] = 3
        [SW_SHOWMINIMIZED] = 2
        [SW_SHOWMINNOACTIVE] = 7
        [SW_SHOWNA] = 8
        [SW_SHOWNOACTIVATE] = 4
        [SW_MINIMIZE] = 6
        [SW_RESTORE] = 9
        [SW_SHOWDEFAULT] = 10
    End Enum'关闭消息框Function CloseMsgBox(ByVal Caption As String, Optional ByVal Class As String = "#32770") 
        Dim frmhwnd As Long
     
        frmhwnd = FindWindow(Class, Caption)    SendMessage frmhwnd, WM_CLOSE, 0, 0End Function
    '激活窗口
    Sub SetForeForm(ByVal frmhwnd As Long)
        ShowForm frmhwnd, SW_SHOWDEFAULT
            
        SetForegroundWindow frmhwnd
    End SubSub ShowForm(ByVal hwnd As Long, ShowType As ShowTypes)
        ShowWindow hwnd, ShowType
    End Sub
      

  2.   

    to云:你给我的是几个函数吧,我还不大懂,看了些其它文章,也是这些函数
    现在我贴上我的现有程序,你帮忙看看,你那几个函数用在哪里,怎么用^_^
    我刚学vb30天,见谅了,因为时间问题,不想多花精力在语言的学习上了-__-
    '程序如下,因为大家没有这个软件,所以你们运行应该不行的
    Dim Synergy As Object
    Dim ImpOpts As Object
    Dim Project As Object
    Dim MeshGenerator As Object
    Dim BoundaryConditions As Object
    Dim Vector As Object
    Dim EntList As Object
    Dim EntList_1 As Object
    Dim StudyDoc As Object
    Dim Viewer As Object
    Dim Plot As Object
    Dim Plot_2 As Object
    Dim plot_1 As Object
    Dim phWnd As Long
    Dim WM_KEYDOWN As Long
    Dim VK_RETURN As LongPrivate Sub Form_Load()'这些是用宏录制的代码
    Set Synergy = CreateObject("synergy.Synergy")
    Synergy.NewProject "2", "F:\2"
    Set ImpOpts = Synergy.ImportOptions()
    ImpOpts.MeshType "Midplane"
    ImpOpts.Units "m"
    ImpOpts.MDLKernel ""
    Set Project = Synergy.Project()
    Synergy.ImportFile "F:\plane.igs", ImpOpts, False
    Set Project = Synergy.Project()
    Project.RenameItemByName "plane_Study", "Study", "try"
    Set MeshGenerator = Synergy.MeshGenerator()
    MeshGenerator.EdgeLength 4
    MeshGenerator.TetraLayers 6
    MeshGenerator.TetraMaxAR 15
    MeshGenerator.Generate
    Set StudyDoc = Synergy.StudyDoc()
    StudyDoc.AnalysisSequence "Flow"
    Set MatSel = Synergy.MaterialSelector()
    MatSel.Select "BP Chemicals.21000.udb", "System", 1008, 0
    Set BoundaryConditions = Synergy.BoundaryConditions()
    Set Vector = Synergy.CreateVector()
    Set EntList = BoundaryConditions.CreateEntityList()
    EntList.SelectFromString "N325 "
    Vector.SetXYZ 3.25261E-16, -1.0842E-16, 1
    Set EntList_1 = BoundaryConditions.CreateNDBC(EntList, Vector, 40000, Nothing)
    Set PropEd = Synergy.PropertyEditor()
    Set Prop = PropEd.FindProperty(30011, 1)
    Set DVec = Synergy.CreateDoubleArray()
    DVec.AddDouble 15
    Prop.FieldValues 10102, DVec
    Set DVec = Synergy.CreateDoubleArray()
    DVec.AddDouble 220
    Prop.FieldValues 11002, DVec
    Set DVec = Synergy.CreateDoubleArray()
    DVec.AddDouble 55
    Prop.FieldValues 11108, DVec
    PropEd.CommitChanges "Process Conditions"
    Set StudyDoc = Synergy.StudyDoc()
    StudyDoc.AnalyzeNow True, True
    '这一句到Sendmessage那句不是
    AppActivate "Moldflow Plastics Insight 4.0", TruePublic Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    phWnd = FindWindow(vbNullString, "QWER ANALYS")
    PostMessage phWnd, WM_KEYDOWN, VK_RETURN, 0        '想向那个确定发送enter键
                                                       '但是刚才运行这句好像没作用'是宏录制的
    Set Viewer = Synergy.Viewer()
    Set Plot = Viewer.GetPlot(13)
    Viewer.ShowPlot Plot
    Set Viewer = Synergy.Viewer()
    Set Plot_2 = Viewer.GetPlot(13)
    Viewer.ShowPlot Plot_2
    Set plot_1 = Viewer.GetActivePlot()
    plot_1.SaveResultInXML "F:\2\tryResultShrink.xml"
    Set plot_1 = NothingSet Project = Synergy.Project()
    Project.CloseAppActivate "工程1", True     '是在这里返回vb吗?好像也没作用End Sub
    '谢谢先,麻烦啦
      

  3.   

    想实现按钮自动点击?? 
     WM_KEYDOWN常量定义了吗?
      

  4.   

    想实现按钮自动点击?? 
     WM_KEYDOWN常量定义了吗?
      

  5.   

    或用这个方法:
    自己再改一下就可以了如何用代码控制选择一个已经编译EXE的SSTAB各项
    测试通过代码如下: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 Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202Private Sub Command1_Click()
    Dim lngFrmHwnd As Long
    Dim lngBtnHwnd As Long
    Dim x, y, i As Long
        
        lngFrmHwnd = FindWindow(vbNullString, "Form1")  '窗口标题
        If lngFrmHwnd > 0 Then
            lngBtnHwnd = FindWindowEx(lngFrmHwnd, ByVal 0&, "SSTabCtlWndClass", vbNullString) 'SSTabCtlWndClass是SStab的类
        End If
        
        If lngBtnHwnd > 0 Then
         x = 333 '这里是SStab控件中某个按钮在窗体中的位置 单位pixel
         y = 0
         i = (y * 256 ^ 2 + x) '(x,y)就是欲模拟点击的位置。
         SendMessage lngBtnHwnd, WM_LBUTTONDOWN, 0&, ByVal i '鼠标按下
         SendMessage lngBtnHwnd, WM_LBUTTONUP, 0&, ByVal i '鼠标释放
        End If
    End Sub
      

  6.   

    lngBtnHwnd = FindWindowEx(lngFrmHwnd, ByVal 0&, "SSTabCtlWndClass", vbNullString) 'SSTabCtlWndClass是SStab的类
    是另外程序的子窗口 即 含“确定”按钮的窗口的句柄?
    其中的 类 如何得到,是“确定”这个字符串吗?
    还有,我想点击确定后,自动返回到vb的环境,或者说代码窗口,用二楼大侠
    '激活窗口
    Sub SetForeForm(ByVal frmhwnd As Long)
        ShowForm frmhwnd, SW_SHOWDEFAULT
            
        SetForegroundWindow frmhwnd
    End SubSub ShowForm(ByVal hwnd As Long, ShowType As ShowTypes)
        ShowWindow hwnd, ShowType
    End Sub
    怎么不好用啊,是因为那个“确定”的问题没解决,窗口跳不回来吗?
      

  7.   

    按钮的类名:ThunderCommandButton
      

  8.   

    Option ExplicitDim lngBtnHwnd As Long
    Dim lngFrmHwnd As LongPrivate Declare Function SetActiveWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    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, lParam As Any) 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 Const WM_KEYDOWN = &O100
    Private Const VK_RETURN = &HD
    Private Const WM_QUIT = &O12
    Private Const BM_CLICK = &O245
    Private Const WM_CLOSE = &H10'在表单中加入一个 CommandButton 加入以下程序码:Private Sub Command1_Click()Shell "D:\Program Files\popoinstall\Start.exe"
    lngFrmHwnd = FindWindow(vbNullString, "登录POPO2004")  '窗口标题
    Do    If lngFrmHwnd <> 0 Then
            lngBtnHwnd = FindWindowEx(lngFrmHwnd, ByVal 0&, "ThunderCommandButton", "登陆")
        End If
               
        If lngBtnHwnd <> 0 Then
            SendMessage lngFrmHwnd, WM_CLOSE, ByVal 0&, ByVal 0&
            PostMessage lngBtnHwnd, VK_RETURN, 0, 0
        End If
    Loop Until lngFrmHwnd = 0End Sub'这是popo2004的弹出窗口,想回车登陆,或者esc或者AltF4类似的关闭都不行
    '和我本身要完成的课题的问题是一样的,大家这次可以实际编程试验一下了
      

  9.   

    哪有那么麻烦??
    测试通过:Option Explicit
    Dim lngBtnHwnd As Long
    Dim lngFrmHwnd As Long   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, lParam As Any) 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 Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202'在表单中加入一个 CommandButton 加入以下程序码:Private Sub Command1_Click()
    Dim i As Long
    Dim lngFrmHwnd, lngBtnHwnd As Long
     Shell "D:\Program Files\popoinstall\Start.exe"
    lngFrmHwnd = FindWindow(vbNullString, "Form1")  '窗口标题
     Do    If lngFrmHwnd <> 0 Then
            lngBtnHwnd = FindWindowEx(lngFrmHwnd, ByVal 0&, "ThunderCommandButton", "登陆")
        End If
               Debug.Print lngFrmHwnd
               Debug.Print lngBtnHwnd
        If lngBtnHwnd <> 0 Then
         x = 1 '这里是按钮在其所在窗体中的位置 单位pixel 首先你要知道那个“登陆”在它所在窗体的相对位置
         y = 1
         i = (y * 256 ^ 2 + x) '(x,y)就是欲模拟点击的位置。
         SendMessage lngBtnHwnd, WM_LBUTTONDOWN, 0&, ByVal i '鼠标按下
         SendMessage lngBtnHwnd, WM_LBUTTONUP, 0&, ByVal i '鼠标释放
        End If
     Loop Until lngFrmHwnd = 0End Sub
      

  10.   

    to:霖
    lngFrmHwnd = FindWindow(vbNullString, "Form1")  '窗口标题
    不是那个弹出窗口的标题吗?如“登陆popo2004”?另外,如何得到一个按钮在所在窗体的位置?谢过啦,真的很感谢你一直以来的帮助!thx!
      

  11.   

    我好像知道了,同样是spy,哈哈
      

  12.   

    to霖
    lngFrmHwnd = FindWindow(vbNullString, "登陆popo2004")  '窗口标题
     Do    If lngFrmHwnd <> 0 Then
            lngBtnHwnd = FindWindowEx(lngFrmHwnd, ByVal 0&, "ThunderCommandButton", "登陆")
        End If
               Debug.Print lngFrmHwnd
               Debug.Print lngBtnHwnd
         If lngBtnHwnd <> 0 Then
            x = 208 '这里是按钮在其所在窗体中的位置 单位pixel 首先你要知道那个“登陆”在它所在窗体的相对位置
            y = 206
            i = (y * 256 ^ 2 + x) '(x,y)就是欲模拟点击的位置。
            SendMessage lngBtnHwnd, WM_LBUTTONDOWN, 0&, ByVal i '鼠标按下
            SendMessage lngBtnHwnd, WM_LBUTTONUP, 0&, ByVal i '鼠标释放
        End If
    Loop Until lngFrmHwnd = 0怎么出来的是
    0
    0
    而且好像鼠标没有点击那个确定,你确定你运行成功了么?
      

  13.   

    我没拿popo2004试,手上没有
    你要先spy出窗体的完整确定的名称和按钮确定的名称
    至于按钮位置,可以截下图放到vb的picturebox算一下,因为相对位置是不变的。我是拿自己的另外程序试验成功的
      

  14.   

    QQ也行,就是用shell语句启动,然后有登陆等弹出窗口的程序
    可能是弹出要有一段时间滞后,但是findwindow语句已经执行
    而执行时,窗口还没显示,用延时的sleep语句可以搞定,但是
    我想它一弹出来,我就知道,并且响应,即用findwindow
    查文章看到有个GetlastActivePopup函数,不过我还没试验,先
    回文章,哈哈,谢谢一直关注 //hand另外,我先打开popo或者qq,findwindowex好像不作用,查不到
    “登陆”的句柄,是我哪里用错了?如果霖你有qq可以试一下,成功的话,重重奖励哦^_^
      

  15.   

    qq和popo等运行后,弹出登陆窗口,
    “登陆”的类型是“Button”拥有默认焦点
    按回车就会登陆
      

  16.   

    Button类的父类是“#32770”,#32770的父类是Afx:400000:0
    就是说,要找到Button,就先要得到“#32770”的句柄,要得到“#32770”的句柄,就要得到Afx:400000:0的句柄,我卡在了找“#32770”的句柄这个环节上,因为“#32770”的标题不是正规字符,是几个换行符+空格+回车符,我不知道是哪个asc码,不知道哪个高手还有别的办法(我是指得到那个按钮的句柄,not 模拟键盘按回车解决问题)。从这点,可以看到腾讯是多么阴险。-_-||
      

  17.   

    哈哈,你指的qq的caption吧,确实呀,所以我用popo来试验
    刚才试验了
    k=AnyPopup()
    If k <> 0 Then
        k = GetLastActivePopup(hwnd)
    不行,仍然得不到popo的句柄
    莫非一定要用延时?
      

  18.   

    我可以得到“登陆”的句柄啦,哈哈,
    用GetDlgItem。但是鼠标模拟点击时说
    SendMessage lngBtnHwnd, WM_LBUTTONDOWN, 0&, ByVal i
    “DLL调用约定错误”
      

  19.   

    关闭那个窗口已经可以实现SendMessage lngFrmHwnd, WM_CLOSE, 0, 0
    不用找“确定”的句柄,浪费啊现在问题是捕获那个弹出的瞬间,然后才能发送上述消息
    如何捕获它的弹出呢
      

  20.   

    谢谢hzy,否则我都不能发文啦现在剩第二个问题了,就是如何返回vb自己,像鼠标单击了vb似的
    Option ExplicitDim lngBtnHwnd As Long
    Dim lngFrmHwnd As Long
    Dim lngFrm1Hwnd As Long
    Dim lngFrm2Hwnd As Long
    Private Const WM_CLOSE = &H10Private 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, lParam As Any) As Long
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As LongEnum ShowTypes
        [SW_HIDE] = 0
        [SW_SHOW] = 5
        [SW_SHOWNORMAL] = 1
        [SW_SHOWMAXIMIZED] = 3
        [SW_SHOWMINIMIZED] = 2
        [SW_SHOWMINNOACTIVE] = 7
        [SW_SHOWNA] = 8
        [SW_SHOWNOACTIVATE] = 4
        [SW_MINIMIZE] = 6
        [SW_RESTORE] = 9
        [SW_SHOWDEFAULT] = 10
    End Enum'在表单中加入一个 CommandButton 加入以下程序码:Private Sub Command1_Click()lngFrmHwnd = 1&
    lngBtnHwnd = 1&Timer1.Enabled = True
    Timer1.Interval = 6000 '有足够时间单击另外的窗口如记事本,使焦点转到另外的地方
    Shell "D:\Program Files\popoinstall\Start.exe"lngFrm2Hwnd = FindWindow("wndclass_desked_gsk", vbNullString)
    If lngFrm2Hwnd <> 0 Then
        SetForegroundWindow lngFrm2Hwnd
        'SetForegroundWindow lngFrm2Hwnd            '我想试验几个函数
        'ShowWindow lngFrm2Hwnd, SW_SHOWMAXIMIZED   '不过都不好用
    End IfDebug.Print lngFrm2Hwnd                         '句柄能找到End SubPrivate Sub Timer1_Timer()                      '实现有时间间隔的查找,成功
            
        lngFrmHwnd = FindWindow(vbNullString, "登录POPO2004")  '窗口标题
        If lngFrmHwnd <> 0 Then
            SendMessage lngFrmHwnd, WM_CLOSE, 0, 0
        End If    If lngFrmHwnd > 1 Then
            Timer1.Enabled = False
        End If
        
    End Sub
      

  21.   


    Me.ZOrder'激活窗体,并显示出来