等待加载第三方应用程序窗口
我正在尝试创建一个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());
我假设你有一种方法来检测你想要发送输入的窗口在屏幕上显示,但是由于窗口很忙,立即发送输入不起作用。
你可以有一个预定义的/硬编码的等待间隔(可能为每个Java窗口定制) - 这不是非常可靠,但可能在受控环境下运行良好(例如,如果应用程序只用于你的计算机)。
如果窗口的外观在加载完成后可靠地更改,则可以捕获窗口的屏幕截图并测试以查看是否存在正确的像素,并在发送消息之前重复此操作直至为true。
另一个选择是使用Spy ++查看加载完成时是否为窗口生成了任何特定的消息(例如,可以使用某些参数重新绘制)并安装钩子来检测这些消息。
如果Java应用程序使用本机窗口控件(SWT),则可以尝试检测窗口文本/结构中指示加载完成的更改。
如果窗口加载过程是资源密集型的,那么您可能还会监控java应用程序的CPU使用情况,并在发送消息之前等待“高峰期”结束。
链接地址: http://www.djcxy.com/p/10905.html上一篇: Wait for third party application window to load
下一篇: Sending a javascript array to code behind(c#) using ajax