如何在Windows 7中监视应用程序窗口的显示状态?

时间:2016-02-19 12:37:30

标签: java-native-interface jna

我需要监视Windows7中任何应用程序窗口的显示状态。我试图找出是否有任何应用程序窗口(基于进程ID)处于最小化/最大化/正常状态。

我在Windows 7 Enterprise上使用JNA 4.2.1,Java 8 update72。 任何指针都会非常有用。在此先感谢所有人。

我尝试的示例代码如下所示。

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinUser.HOOKPROC;
import com.sun.jna.platform.win32.WinUser.MSG;

public class Main{
    public static void main(String[] args) {
        HOOKPROC proc = new HOOKPROC() {
            public User32.LRESULT callWndRetProc(int nCode, User32.WPARAM wParam, User32.LPARAM lParam) {
                            System.out.println("Recieved window event");
                return User32.INSTANCE.CallNextHookEx(null, nCode, wParam, lParam);
            }
        };
        User32.INSTANCE.SetWindowsHookEx(12, proc, null, 0);
    }
}

1 个答案:

答案 0 :(得分:0)

不容易做到。来自MSDN:

  

如果dwThreadId参数为零或指定a的标识符   由不同进程创建的线程,lpfn参数必须指向   到DLL中的钩子过程。否则,lpfn可以指向一个钩子   与当前流程相关的代码中的过程。

JNA动态生成一小段代码,这些代码回调到Java中,并使用它们为基于Java的函数提供本机函数指针。但是,此代码假定您已经启动并运行了JVM,并且因为它们是动态生成的,所以它们存在于DLL中。

SetWindowsHookEx 的回调函数必须是DLL驻留的,如果不在与目标窗口相同的线程中。为了使用JVM,该DLL驻留回调函数必须负责启动JVM(如果尚未运行)。 JNA对DLL驻留回调有一些支持,但遗憾的是没有实现任何你需要的JVM启动支持才能使它真正起作用。