我需要监视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);
}
}
答案 0 :(得分:0)
不容易做到。来自MSDN:
如果dwThreadId参数为零或指定a的标识符 由不同进程创建的线程,lpfn参数必须指向 到DLL中的钩子过程。否则,lpfn可以指向一个钩子 与当前流程相关的代码中的过程。
JNA动态生成一小段代码,这些代码回调到Java中,并使用它们为基于Java的函数提供本机函数指针。但是,此代码假定您已经启动并运行了JVM,并且因为它们是动态生成的,所以它们不存在于DLL中。
SetWindowsHookEx
的回调函数必须是DLL驻留的,如果不在与目标窗口相同的线程中。为了使用JVM,该DLL驻留回调函数必须负责启动JVM(如果尚未运行)。 JNA对DLL驻留回调有一些支持,但遗憾的是没有实现任何你需要的JVM启动支持才能使它真正起作用。