我做了一个模拟键盘输入的后台程序,目的是在启动我的另一应用程序后,它开始模拟键盘向应用程序输入,但应用程序在某些Edit输入完成按下回车键后,要访问网络数据库,根据不同结果可能要弹出对话框,这样就使模拟程序运行不正常,怎样才能等到输入回车后得到结果后在模拟下一键输入,我用Sleep试过,但由于网络原因,返回结果的时间无法确定。如何才能在返回结果后再继续运行模拟程序进行模拟键输入?谢谢。

解决方案 »

  1.   

    "根据不同结果可能要弹出对话框"试试根据对话框是否存在来等待。
    while (1)
    {
       if (FindWindow(...))//对话框还在
          break;
       Sleep(1000);//1秒后重试
    }
      

  2.   

    等到输入回车后?在PreTranslateMessage中判断是否是按下ENTER?
      

  3.   

    应用程序是其他人用PB开发的,没有源代码,我的意思是在一个edit控件按下回车后,执行完其script后,其scrip中含访问网络数据库的代码,并根据edit控件输入是否合法,可能弹出对话框,也可能不弹出对话框。如果弹出对话框我要关闭它,不弹出对话框继续转到其他控件进行输入,但其弹出时间不能确定(视网络状况或数据库响应速度定)我如何才能在其script真正执行完毕后,再模拟输入键。我想过通过截获数据包是否返回做,但太复杂,时间不允许。有谁有比较好的办法或思路,谢谢了。
      

  4.   

    这种情况最好不用模拟键盘输入,建议对Edit用SetWindowText,对按钮用PostMessage模拟按下动作。
      

  5.   

    我在我的后台程序中用DWORD WaitForInputIdle(
      HANDLE hProcess,       // handle to process
      DWORD dwMilliseconds   // time-out interval in milliseconds
    );函数试了试,可以,hProcess是我用spy++截获应用程序的ProcessID,然后用OpenProcess
    函数得到的,但是用什么方法可以得到正在运行的程序的ProcessID呢?用GetWindowThreadProcessId
    函数得到的只是其thread ID.
      

  6.   

    GetWindowThreadProcessId
    的第二个参数返回进程ID,返回值是创建窗口的线程ID