高分求解一巨难问题。。。

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

9 个解决方案

#1


"根据不同结果可能要弹出对话框"

试试根据对话框是否存在来等待。
while (1)
{
   if (FindWindow(...))//对话框还在
      break;
   Sleep(1000);//1秒后重试
}

#2


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

#3


老 拉

#4


该回复被版主删除

#5


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

#6


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

#7


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

#8


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

#9


问题解决,谢谢各位。

#1


"根据不同结果可能要弹出对话框"

试试根据对话框是否存在来等待。
while (1)
{
   if (FindWindow(...))//对话框还在
      break;
   Sleep(1000);//1秒后重试
}

#2


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

#3


老 拉

#4


该回复被版主删除

#5


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

#6


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

#7


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

#8


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

#9


问题解决,谢谢各位。