我正在尝试从我的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更改为“关闭窗口事件”也可能值得一试,但我不知道如何将此事件发送到另一个程序的窗口。
我是新手,所以请保持简单的答案。
提前致谢。
答案 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值进行额外检查。