【问题标题】:Automated Clicking Problem自动点击问题
【发布时间】:2010-10-20 00:00:55
【问题描述】:

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

我希望这是有道理的。

干杯

罗斯

编辑

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

【问题讨论】:

    标签: dialog detection user32 automated-tests


    【解决方案1】:

    解决这个问题的方法似乎是使用 SendMessage API 而不是 mouse_event 或 SendInput API。这样做的原因是 SendMessage 会阻塞,直到它被处理为止。只需确保您始终在您想要单击的位置(使用 WindowFromPoint)下立即获得窗口句柄,并使用 ScreenToClient 将鼠标坐标从屏幕转换为客户端坐标。使用 ((pt.Y

    【讨论】:

    • 这种方法似乎有一个内在的缺点,即对发送的消息的响应充其量是不一致的。例如,尝试将此方法与 WM_NCLBUTTONDOWN/UP 一起使用以单击记事本中的文件菜单会导致菜单循环开始然后立即结束而不实际显示菜单。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的意见,我正在编写的程序是一个相当通用的猴子测试程序,而不是针对任何特定程序。因此,它不会提前知道对话框是否会作为任何操作的结果出现。如果有一个钩子可以检测到进程空闲,那将是理想的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多