Tux*_*man 7 c# multithreading wait window-load
我正在尝试创建一个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());
Run Code Online (Sandbox Code Playgroud)
我假设您有一种方法可以检测要发送输入的窗口何时显示在屏幕上,但由于窗口正忙,因此立即发送输入不起作用。
您可以有一个预定义/硬编码的等待间隔(可能为每个 Java 窗口自定义) - 这不是很可靠,但可能在受控环境中运行良好(例如,如果该应用程序仅在您的计算机上使用)。
如果加载完成后窗口的外观发生可靠的变化,您可以捕获窗口的屏幕截图并测试是否存在正确的像素,并在发送消息之前重复此操作直到为 true。
另一种选择是使用 Spy++ 查看加载完成时是否为窗口生成任何特定消息(例如,可能是使用某些参数重新绘制),并安装一个挂钩来检测这些消息。
如果 Java 应用程序使用本机窗口控件 (SWT),您可以尝试检测窗口文本/结构中指示加载已完成的更改。
如果窗口加载过程是资源密集型的,您还可以监视 java 应用程序的 CPU 使用情况,并在发送消息之前等待“峰值”结束。
| 归档时间: |
|
| 查看次数: |
1373 次 |
| 最近记录: |