1

我正在编写一个用于自动化测试的程序,该程序使用各种 User32.dll 库调用随机单击打开的应用程序窗口。我当前的问题是,如果单击会打开一个对话框,则使用 Process.WaitForInputIdle() 不会等待足够长的时间来检测到该对话框的下一次循环,这意味着会提示多次点击,如果这些点击发生出现在我想避免的对话框中的某些内容上(比如退出按钮),无法提前告知。我的问题是这个。有没有办法等待进程或线程完成所有处理并且只在消息循环中再次等待?

我希望这是有道理的。

干杯

罗斯

编辑

如果做不到这一点,是否有可能将目标程序和我的程序的进程/线程设置为都使用相同的处理器并调整每个处理器的优先级,以便目标程序获得优先权?

4

2 回答 2

1

不幸的是,一旦应用程序处于没有输入消息等待的消息循环中,WaitForInputIdle 就会立即返回。

如果您拥有对话框的代码,您可以让对话框在其 WM_INITDIALOG 中调用 SetEvent,以向您的自动化发出信号,表明它已准备好进行测试。或者,您可以查看在进程上使用 SetWinEventHook 并等待实际创建对话框,然后再向其发送输入事件。

于 2009-04-17T00:06:38.900 回答
0

解决这个问题的方法似乎是使用 SendMessage API 而不是 mouse_event 或 SendInput API。这样做的原因是 SendMessage 阻塞,直到它被处理。只需确保您始终在您想要单击的位置(使用 WindowFromPoint)下立即获得窗口句柄,并使用 ScreenToClient 将鼠标坐标从屏幕转换为客户端坐标。使用 ((pt.Y << 16) + pt.X) 将坐标打包到 lParam 参数中。这将阻塞直到被处理,因此显示的任何模式对话框都会阻塞此调用。

于 2009-04-22T03:30:42.223 回答