7

我正在尝试创建一个 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 等待程序加载后再发送

我正在寻找具有相同想法但支持多线程或您可能拥有的任何其他想法的东西?!:)

遵循 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());
4

1 回答 1

3

我假设您有一种方法可以检测要发送输入的窗口何时显示在屏幕上,但是由于窗口繁忙,因此无法立即发送输入。

您可以有一个预定义/硬编码的等待间隔(可能为每个 Java 窗口定制) - 这不是很可靠,但可能在受控环境中运行良好(例如,如果应用程序仅在您的计算机上使用)。

如果加载完成后窗口的外观发生了可靠的变化,您可以捕获窗口的屏幕截图并测试是否存在正确的像素,然后在发送消息之前重复此操作直到为真。

另一种选择是使用 Spy++ 来查看加载完成时是否为窗口生成任何特定消息(例如,可能是使用某些参数重新绘制)并安装一个挂钩来检测这些消息。

如果 Java 应用程序使用本机窗口控件 (SWT),您可以尝试检测窗口文本/结构中指示加载完成的变化。

如果窗口加载过程是资源密集型的,您还可以监控 Java 应用程序的 CPU 使用情况,并在发送消息之前等待“峰值”结束。

于 2012-06-20T16:13:15.077 回答