Windows系统下如何获取Word窗口的激活状态?
检测Windows系统下Word窗口的激活状态
Hey Roman, 你的问题我太懂了——那段Swing FocusManager的代码之所以返回null,是因为它只能追踪Java自己的Swing应用窗口,完全管不到系统里的外部程序(比如Word这种原生Windows应用)。要实现系统级别的窗口状态检测,我们得借助Windows原生API,这里推荐用**JNA(Java Native Access)**来做,不用写复杂的JNI C代码,纯Java就能搞定。
为什么你的原代码不行?
javax.swing.FocusManager.getCurrentManager().getActiveWindow() 这个方法的作用范围仅限于当前Java虚拟机里的Swing窗口,对于系统中其他进程的窗口(比如Word、Chrome等)完全无法感知,所以返回null是预期结果。
可行的实现方案:用JNA调用Windows API
JNA是一个Java库,能让我们直接调用Windows的原生函数,不需要编写JNI绑定。下面是具体步骤:
1. 引入JNA依赖
如果用Maven,在pom.xml里添加:
<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.13.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.13.0</version> </dependency>
如果不用构建工具,可以直接下载jna.jar和jna-platform.jar添加到项目类路径中。
2. 编写检测代码
我们需要调用两个Windows API函数:
GetForegroundWindow():获取当前系统中处于激活状态的窗口句柄GetClassName():根据窗口句柄获取窗口的类名(Word的窗口类名是固定的OpusApp,比匹配窗口标题更可靠)
完整代码示例:
import com.sun.jna.Native; import com.sun.jna.platform.win32.User32; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.ptr.IntByReference; public class WordWindowChecker { public static void main(String[] args) { // 获取User32库的实例 User32 user32 = User32.INSTANCE; // 获取当前激活的窗口句柄 HWND foregroundWindow = user32.GetForegroundWindow(); if (foregroundWindow == null) { System.out.println("没有激活的窗口"); return; } // 准备缓冲区存储窗口类名 char[] classNameBuffer = new char[256]; IntByReference classNameLength = new IntByReference(256); // 获取窗口类名 user32.GetClassName(foregroundWindow, classNameBuffer, classNameLength.getValue()); String windowClassName = Native.toString(classNameBuffer); // 判断是否是Word窗口 boolean isWordActive = "OpusApp".equals(windowClassName); if (isWordActive) { System.out.println("Word窗口当前处于激活状态"); } else { System.out.println("Word窗口未激活"); } // 可选:获取窗口标题,辅助验证 char[] windowTitleBuffer = new char[256]; user32.GetWindowText(foregroundWindow, windowTitleBuffer, 256); String windowTitle = Native.toString(windowTitleBuffer); System.out.println("当前激活窗口标题:" + windowTitle); } }
代码说明
User32.INSTANCE:JNA已经帮我们封装好了Windows的user32.dll,直接调用即可GetForegroundWindow():返回当前获得焦点的窗口句柄GetClassName():获取窗口的类名,Word的类名是OpusApp,这个值是固定的,不会因为文档标题变化而改变,比匹配窗口标题更准确- 可选的
GetWindowText():可以获取窗口标题,用来辅助验证当前激活的窗口是不是你要找的Word文档
注意事项
- 这个方案仅适用于Windows系统,因为调用的是Windows原生API
- 确保你的项目正确引入了JNA的依赖,否则会出现类找不到的错误
- 如果需要持续检测窗口状态,可以用定时任务(比如
ScheduledExecutorService)定期执行检测逻辑
内容的提问来源于stack exchange,提问作者roman tenger
相关产品推荐
相关产品推荐

