尽管窗口已经关闭,但FindWindow不会返回IntPtr.Zero

时间:2010-09-27 13:54:23

标签: c# events sendkeys findwindow

我正在尝试从我的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更改为“关闭窗口事件”也可能值得一试,但我不知道如何将此事件发送到另一个程序的窗口。

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

提前致谢。

5 个答案:

答案 0 :(得分:1)

我会使用Spy++来查看Java应用程序的窗口句柄,看看你是否能弄清楚还有什么事情发生了 - 我同意必须有一种方法可以告诉它已关闭。< / p>

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

答案 1 :(得分:0)

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

如果是我写这些东西(如果我能够更改Java代码),我可能会添加一种查询java应用程序以查看其窗口是否显示的方法。 套接字接口或其他东西。

答案 2 :(得分:0)

我的猜测是,Java代码/ VM没有完全处理窗口,或者它以某种特殊方式处理Alt + F4(即可能使其自身不可见而不是关闭)。

答案 3 :(得分:0)

创建/删除Windows无法控制。如果您想使用您想要的相同资源可靠地检测到“其他人”的存在,请让另一方明确地进行通信。

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

答案 4 :(得分:0)

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