gpt4 book ai didi

c# - 等待第三方应用程序窗口加载

转载 作者:太空狗 更新时间:2023-10-29 20:34:38 24 4
gpt4 key购买 nike

我正在尝试创建一个 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());

最佳答案

我假设您有一种方法可以检测您要向其发送输入的窗口何时显示在屏幕上,但是立即发送输入不起作用,因为该窗口正忙。

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

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

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

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

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

关于c# - 等待第三方应用程序窗口加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11121186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com