我正在尝试创建一个C#.NET 2.0脚本,以自动化用Java编写的第三方应用程序中的工作流。
我正在使用user32.dll函数来与Java应用程序窗口进行交互。
我的问题是Java应用程序窗口完全加载速度很慢,而IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, UInt32 wParam, IntPtr lParam)
发送的操作有时会丢失。示例:在加载主窗口期间,如果我尝试打开菜单(此时我实际上在主窗口上有一个句柄),我的消息就会丢失,菜单永远不会打开。
我在Stack Overflow上找到了一些答案,告诉我们可以使用Process.WaitForInputIdle()
方法用于此目的,但我发现这只适用于应用程序是单线程的,而不是我的Java应用程序的情况。 (C# SendKeys Wait for Program to Load before sending)
我正在寻找一些同样的想法,但支持多线程或任何其他想法的东西?!:)
按照Mari9的想法,我最终使用System.Diagnostic.PerformanceCounter()
来观看第三方应用流程活动。然后它命令为0,这意味着该进程已完成它必须执行的操作并能够执行我发送的消息。
PerformanceCounter PC = new PerformanceCounter();
PC.CategoryName = "Process";
PC.CounterName = "% Processor Time";
PC.InstanceName = "<process name>";
Console.WriteLine(PC.NextValue().ToString());
答案 0 :(得分:3)
我假设您有一种方法可以检测到您想要发送输入的窗口何时显示在屏幕上,但是由于窗口正忙,所以立即发送输入不起作用。
您可以拥有预定义/硬编码等待间隔(可能为每个Java窗口自定义) - 这不是很可靠,但在受控环境中可能运行良好(例如,如果仅在您的计算机上使用该应用程序)。 / p>
如果加载完成后窗口的外观可靠地更改,您可以捕获窗口的屏幕截图并测试是否存在正确的像素,并在发送消息之前重复此操作直到为真。
另一种选择是使用Spy ++来查看在加载完成时是否为窗口生成了任何特定的消息(例如,可能是某些参数的重绘)并安装一个钩子来检测这些消息。
如果Java应用程序使用本机窗口控件(SWT),您可以尝试检测窗口文本/结构中的更改,指示加载已完成。
如果窗口加载过程是资源密集型的,您还可以监视Java应用程序的CPU使用情况,并在发送消息之前等待“峰值”结束。