比如在另外一个程序里面有个按钮,点击该按钮调用我的程序,在输入正确数值后继续执行第一个程序?例如:程序A,点击按钮弹出msgbox "AA",我的程序弹出对话框,要求输入1234,如果输入正确则继续执行程序A,如果不正确,弹出错误对话框,并中断程序A操作,就好像没有点击该按钮一样。如何做到?

解决方案 »

  1.   

    另外一个程序A,也是自己写的吗?
    如果是就好办,可以通过注册表,txt文件,ini文件,数据库什么的来验证输入。
    即“我的程序”写入内容,程序A读出和验证
      

  2.   

    调用程序用shell,参数传递用txt、数据库、INI等。
      

  3.   

    程序A是别人做的,现在等于是截获程序A的鼠标点击事件,并拦截消息传递,然后调用自己的程序,如果输入正确,则继续执行程序A
      

  4.   

    Private Sub Command1_Click()
        Dim x As Single
        x = Val(InputBox(""))
        If x = 1 Then
            Call a1
        ElseIf x = 2 Then
            Call a2
        ElseIf x = 3 Then
            Call a3
        Else
            Call a4
        End If
    End SubPublic Function a1()
        MsgBox "a1", vbInformation
    End FunctionPublic Function a2()
        MsgBox "a2", vbInformation
    End FunctionPublic Function a3()
        MsgBox "a3", vbInformation
    End FunctionPublic Function a4()
        MsgBox "a4", vbInformation
    End Function
      

  5.   

    ding xia ,wei shen me mei ren lai hui da a ?顶下,为什么没人来帮忙啊?
      

  6.   

    如果两个程序都是自己设计的,那么可以采用DDE实时通信技术实现
      

  7.   

    使用系统钩子应该可以实现。但是VB不能写DLL,不能使用系统钩子。
    拦截程序A的所有窗口消息(也可以拦截A的某个按钮的消息),如果发现是你想要的点击消息,那么执行你指定的程序,执行后如果希望A程序继续执行,那么把消息传给下一个钩子,否则不继续传下去。另外一种方法,很笨但是至少VB可以靠自己完成。
    就是你定义一个和A程序的按钮一模一样的窗口,或者说定义一个没有边框的窗口,里面只放一个按钮。
    接下来,把这个窗口设置成你要拦截的窗口(或者是窗口的按钮)的子窗口,调整好位置,使其覆盖原有按钮。这里需要的是一系列的SendMessage或者是SetWindowLong的操作,一下子说不清楚。
    剩下的就好办了,用户点击的实际上就是你的窗口,如果希望A程序作出反应,那么给A程序的指定按钮发送一个点击消息就好了。
      

  8.   

    fanzai(帆仔) 现在做的就是你说的第一个方法,使用线程钩子,不过setwindowshookex之后,不知道如何得到按下的按钮信息,就是说无法确定是哪个按钮被按下,希望你能够写出详细代码看看。现在唯一的问题就是这里了。
      

  9.   

    我一下子也不能确定,有的时候窗口不同,消息也有区别。会用Spy++吗?VS6.0里面就有。它可以拦截指定窗口(按钮也算窗口)的所有消息。alt+f3找到你的窗口,Ctrl+M并指定选项后,就开始拦截了。注意你的窗口“收到”的消息(一般是以名称显示的,不是数字)。另外,提醒一下下~~
    一个按钮被按到不一定是鼠标点击,有可能是选中之后按下空格,或者按一下快捷健等等:)
      

  10.   

    如果没记错的话,标准的按钮被点击的时候,主窗口会收到一个WM_COMMAND消息,参数:wParam=按钮编号,lPrarm=按扭句柄。
    另外,标准的CheckBox,Text之类的也都有标准的方式发给主窗口消息。特殊的按钮可以不符合这样的规律。
      

  11.   

    fanzai(帆仔) 那如果要达到这样的目的应该怎么做呢?
      

  12.   

    现在的问题是如果控制另外一个程序,是不是必须用全局钩子?如果不是,那用线程钩子的话如何实现?如果钩子设置成功,如何得到按钮被按下的消息?我试过用线程钩子,结果每次setwindowhook的时候那个应用程序就产生错误关闭了。钩子技术只是自己从网上了解到一些,现在整体还是很模糊,怪自己没学好windows消息机制阿请fanzai(帆仔) 为我详细解说一下!不胜感激
      

  13.   

    setwindowhook的时候应该用了回调函数吧?这个回调函数只能写在DLL里面,否则就会出错。
    一般来说,一个程序(进程)是不能调用另一个程序里面的函数的。只能去调用一个DLL。
      

  14.   

    哦,这样啊,我现在调用一个别人写的全局dll达到了目的,就是SysHook这个dll,你应该知道吧,网上流传挺广的,不过调用以后程序反应好像有点迟钝,所以希望能够不用全局的,如果非要全局dll的话,那目前只好这样做了,谢谢你的帮助!