1

我正在尝试从我的 C# 程序控制 Java 应用程序。在程序开始输入数据之前,它会检查是否有任何可通过的数据输入窗口,并尝试关闭它们。

检查窗口是否存在的代码是:

public static bool WindowExists(string WindowName)
{
    IntPtr hWnd = FindWindow(null, WindowName);
    return (hWnd != IntPtr.Zero);
}

直到现在,我只是在一个while循环中使用了这个方法(向窗口发送Alt+F4),直到没有打开的输入窗口离开。

不久前,Java 应用程序得到了更新,这种方法不再有效。出于某种原因,WindowExists 一直返回 true,即使在数据输入窗口关闭之后也是如此。仅当输入窗口至少存在一次时才会发生这种情况。

我什至尝试将 Thread.Sleep() 添加到循环中,以确保这不是由 Java 应用程序中的一些延迟引起的,但它不起作用。

有时简单地调用 WindowExists 会使输入窗口崩溃。

代码没有问题,因为之前已经运行过,而且在其他程序中仍然可以运行,所以肯定是Java程序中的更新有问题。

是否有任何替代/更可靠的方法来检查窗口是否存在?将发送 Alt+F4 更改为“关闭窗口事件”可能也值得一试,但我不知道如何将此事件发送到另一个程序的窗口。

我是新手,所以请保持简单的答案。

提前致谢。

4

5 回答 5

1

我会使用Spy++来观察 Java 应用程序的窗口句柄,看看你是否能弄清楚发生了什么——我同意必须有一种方法来判断它已关闭。

我认为观看进程列表是不可能的......

于 2010-09-27T14:06:53.193 回答
0

我的猜测是,要么窗口没有完全被 Java 代码/VM 处理掉,要么它正在以某种特殊的方式处理 Alt+F4(即可能使自己不可见而不是关闭)。

于 2010-09-27T14:16:18.753 回答
0

窗口的创建/删除是您无法控制的。如果您想使用您想要的相同资源可靠地检测“其他人”的存在,请让对方明确地传达它。

另一方可以通过创建文件、打开端口等方式发出信号,并且可以在退出时释放/删除/关闭它。

于 2010-09-27T14:17:48.690 回答
0

我会冒险猜测,虽然 Java 应用程序正在运行,因此 JVM,窗口的“句柄”尚未被垃圾收集,因此底层指针机制似乎仍然有效。

如果是我写那些东西(并且如果我能够更改 Java 代码),我可能会添加一种查询 Java 应用程序以查看其窗口是否正在显示的方法。一个套接字接口什么的。

于 2010-09-27T14:12:56.080 回答
0

尝试使用 IsWindow API 对 FindWindow 返回的 hWnd 值进行额外检查。

于 2010-09-27T15:25:29.763 回答