You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:37:13