我正在编写一个自动化测试程序,它使用各种User32.dll库调用随机单击打开的应用程序窗口。我目前的问题是,如果点击会打开一个对话框,使用Process.WaitForInputIdle()不会等待足够长的时间来检测该循环中的下一个行程,这意味着会有几次点击,如果这些点击发生在在我想要避免的对话框中(比如退出按钮),没有办法提前说出来。我的问题是这个。有没有办法等待进程或线程完成所有处理,只能再次在消息循环中等待?
我希望这是有道理的。
干杯
罗斯
修改
如果失败了,是否可以设置目标程序和我的程序的进程/线程使用相同的处理器并调整每个处理器的优先级以使目标程序获得优先权?
答案 0 :(得分:1)
一旦应用程序处于消息循环中而没有等待输入消息,WaitForInputIdle将很快返回。
如果您拥有该对话框的代码,您可以让对话框在其WM_INITDIALOG中调用SetEvent,以通知您自动化它已准备好进行测试。或者,您可以查看在进程上使用SetWinEventHook并等待实际创建对话框,然后再向其发送输入事件。
答案 1 :(得分:0)
解决这个问题的方法似乎是使用SendMessage API而不是mouse_event或SendInput API。原因是SendMessage会一直阻塞,直到它被处理完毕。只需确保您始终立即获取窗口的句柄(请使用WindowFromPoint)并使用ScreenToClient将鼠标坐标从屏幕转换为客户端坐标。使用((pt.Y<< 16)+ pt.X)将坐标打包到lParam参数中。这将阻止直到处理,因此显示的任何模态对话框都将阻止此调用。