自动点击问题

发布于 2024-07-17 09:21:51 字数 379 浏览 7 评论 0原文

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

我希望这是有道理的。

干杯

罗斯

编辑

如果失败了,是否可以以某种方式将目标程序和我的程序的进程/线程设置为使用相同的处理器并调整每个处理器的优先级,以便目标程序获得优先权?

I am coding up a program for automated testing which randomly clicks an open application window using various User32.dll library calls. My current problem is this, if a click would open a dialog, using Process.WaitForInputIdle() does not wait long enough for that dialog to be detected the next trip around the loop, which means several clicks get cued and if those clicks happen to be on something in the dialog I want to avoid (say an exit button) there is no way of telling that in advance. My question is this. Is there a way of waiting for the process or thread to finish all processing and only be waiting in the message loop again?

I hope that made sense.

Cheers

Ross

EDIT

Failing this, would it be somehow possible to set the process / threads of the target program and my program to both use the same processor and adjust the prioritorys of each so that the target program gets preference?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

若相惜即相离 2024-07-24 09:21:51

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

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

WaitForInputIdle will unfortunately return as soon as the app is in a message loop with no input messages waiting.

If you own the code to the dialog, you could have the dialog call SetEvent in its WM_INITDIALOG to signal your automation that it is ready for testing. Alternatively, you could look at using SetWinEventHook on the process and wait for the dialog to actually be created before sending input events to it.

稍尽春風 2024-07-24 09:21:51

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

The way around this it seems is to use the SendMessage API instead of the mouse_event or SendInput API. The reason for this is that SendMessage blocks until it has been processed. Just make sure you always get the handle of the window immediatly under where you want to click (using WindowFromPoint) and convert the mouse coordinates from screen to client coords using ScreenToClient. Pack the coordinates into the lParam parameter by using ((pt.Y << 16) + pt.X). This will block until processed and so any modal dialogs shown will block this call.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文