另一个程序假设为a.exe具有如下功能:打开一个菜单项弹出对话框选择需要输入的文件,点击确定之后该输入文件的数据自动加入到a的界面中;点击另一个菜单项弹出一个对话框,点击该对话框的一个“导出数据”按钮后自动生成一个dat文件。请问我怎样用我的程序控制a.exe这个程序的这个功能?也就是用我的程序选择一个输入文件,然后就能生成一个dat文件,该dat文件和用a.exe生成的文件是一样的。说明:我没有a.exe的源代码,只能调用这个进程。请问我该怎么做?查哪方面的资料?哪位大侠有相关之类的资料,请提供一下,谢谢!

解决方案 »

  1.   

    可以先用spy++查找下a.exe程序中的相关窗口,然后你要在你的代码用用FindWindow找到a.exe中的按钮、编辑框等控件的句柄,再利用消息,将相关数据发送给这些窗口然后就OK!
      

  2.   

    我打算用CreateProcess函数打开a.exe,然后用FindWindow找到包含“导出数据”按钮的对话框,然后给“导出数据”按钮发送Click消息。请问这种方法行不行?我还没试过,但觉得不行,还有没有其他要注意到地方?
      

  3.   

    进程间通信。数据量不大的话用WM_COPYDATA。
      

  4.   

    回复5L:数据量很大,a.exe在在将输入文件转为dat文件时需要好几分钟,并且消耗内存很大。不过我会试下你说的方法,不过能不能详细说下这个消息的详细用法,有例子代码最好,谢谢!
    回复2L:我用FindWindow函数找那个对话框的按钮句柄,怎么返回值是0x0000?如果哪位还有其他方法也请告诉一下,能告诉调用哪个函数最好,谢谢!
      

  5.   

    去http://www.vckbase.com/看看有没有合适你的例子
      

  6.   

    我的想法是这样的,先用钩子获取a.exe的菜单ID,当知道该菜单ID后就能够自己模拟发送消息给a.exe,用钩子的方法也行,找到窗口句柄后发送消息也行,其实和QQ尾巴病毒有点差不多~~
    模拟打开菜单后再把你的文件名称复制给弹出的文件对话框,也是要找到该对话框中文件编辑框的句柄,并模拟选择yes按钮``````
    总之就是模拟消息,就好象你自己在用鼠标操作一样,钩子,句柄,我觉得都可以试试!!!
      

  7.   

    还有就是用反编译技术,直接用自己的文件名作为参数,调用a.exe中进行文件操作的函数,但是也要用钩子,只有在同一个进程中才可以进行函数调用~~
      

  8.   

    可以用vc++通过调试的方法找到a.exe中进行文件操作的那些函数的入口地址,参数类型,然后就可以进行传递了~~~
      

  9.   

    使用SendInput模拟用户的按键行为(菜单和按钮一般都有快捷键的),并且在适当的地方加Sleep等待目标程序完成响应。
      

  10.   

    比较麻烦,首先试下命令行参数看它会不会响应,如果可以的话创建进程并把文件名作为命令行参数传给它,若不行的话,则只能通过窗口消息,消息的ID要刚好与按钮的消息ID一致,你可以试验下,如果是VC编译的还是容易测出来的。不过反正要用它就必须让它运行,还不如直接OLE调用这个exe,执行就可以了。
      

  11.   

    帮忙顶一下,用creatprocess创建一个进程可以么?或者我理解错误了……帮忙顶……
      

  12.   

    同意10楼的方法.得到菜单ID,发送菜单消息.弹出对话框以后,先用Spy++得到那个打开文件的编辑框和确定按钮的类名和标题.用FindWindow(类名,标题)得到句柄,类名和标题任选一个都可以的.应该可以用SetWindowText把你的打开的文件路径设到a程序里的打开路径,再发送点点击消息.导出话也差不多.
      

  13.   

    ...FindWindow函数找那个对话框的按钮句柄,怎么返回值是0x0000? 
    FindWindowEx
      

  14.   

    回复17楼:我现在可以实现模拟鼠标点击菜单弹出对话框功能,但我用SendMessage(hWmd,WM_COMMEND,id,0)打开对话框后,我的程序就不返回了,加了Sleep(0)后还是不返回,也就是只有把a.exe弹出的对话框关闭之后才会返回到我的程序的下一个语句。请问这个问题怎么解决?最近忙于其他事情,该功能往后拖了,所以我也就没有急着找解决方法,谢谢以上各位的指点,适当的时候我会及时送分。