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

升级org.eclipse.swt jar后OS.FindWindow方法消失,求解决方案

问题描述

项目原本依赖org.eclipse.swt.win32.win32.x86_64-3.106.0.jar与org.eclipse.swt-3.106.0.jar,通过org.eclipse.swt.internal.win32.OS.FindWindow实现窗口消息发送功能。升级SWT版本至116.0后,OS.FindWindow方法被移除。尝试引入jna-5.13.0.jar和jna-platform-4.5.0.jar,改用JNA的User32.INSTANCE.FindWindow替代,但运行时抛出java.lang.NoClassDefFoundError: Could not initialize class com.sun.jna.platform.win32.WinBase错误。

原代码

import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.internal.win32.TCHAR;

import mypackage.DEFINE;

public class WindowUtil {

    
    public static void fireMessage(int msg,long wParam ,long lParam) {
        
        
        TCHAR  win_name = new TCHAR(OS.CP_INSTALLED, DEFINE.WIN_TITLE,true);
        long hWnd = OS.FindWindow(null,win_name);
        //x64
        boolean blan = OS.PostMessage(hWnd, msg, wParam, lParam);
        //x86
//      boolean blan = OS.PostMessage((int)hWnd, msg, (int)wParam, (int)lParam);
        
    }
}

尝试替换后的代码

import org.eclipse.swt.internal.win32.TCHAR;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.User32;
import org.eclipse.swt.internal.win32.OS;
import com.sun.jna.Pointer;

public class WindowUtil {


public static void fireMessage(int msg,long wParam ,long lParam) {
    
    
    TCHAR  win_name = new TCHAR(0x1, DEFINE.WIN_TITLE,true);
    HWND hwnd = User32.INSTANCE.FindWindow(null, DEFINE.WIN_TITLE);
    long handle = Pointer.nativeValue(hwnd.getPointer());
    //x64
    boolean blan = OS.PostMessage(handle, msg, wParam, lParam);
    //x86
//      boolean blan = OS.PostMessage((int)hWnd, msg, (int)wParam,  (int)lParam);
    
}
}

报错信息

Exception in thread "Thread-15" java.lang.NoClassDefFoundError: Could
not initialize class com.sun.jna.platform.win32.WinBase
at com.sun.jna.platform.win32.WinNT$HANDLE.fromNative(WinNT.java:1366) 
at com.sun.jna.NativeMappedConverter.fromNative(NativeMappedConverter.java:70)
at com.sun.jna.Function.invoke(Function.java:370)
at com.sun.jna.Library$Handler.invoke(Library.java:270)
at com.sun.proxy.$Proxy0.FindWindow(Unknown Source)
解决方案

1. 统一JNA版本

当前混用了不同版本的JNA核心包与platform包(jna-5.13.0.jar和jna-platform-4.5.0.jar),版本不匹配会导致类初始化失败。必须使用同一版本的JNA核心包和platform包,建议升级到对应版本(比如jna-platform-5.13.0.jar),确保两个jar版本完全一致。

2. 简化代码,避免跨框架类型混用

无需依赖SWT的TCHAR,直接用JNA完成窗口查找与消息发送,减少依赖冲突:

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinUser;

import mypackage.DEFINE;

public class WindowUtil {

    public static void fireMessage(int msg, long wParam, long lParam) {
        HWND hwnd = User32.INSTANCE.FindWindow(null, DEFINE.WIN_TITLE);
        if (hwnd != null) {
            // 直接用JNA的PostMessage发送消息
            User32.INSTANCE.PostMessage(hwnd, msg, wParam, lParam);
        }
    }
}

3. 确保依赖完整性

确认项目中已正确引入版本一致的JAR包:

  • jna-x.x.x.jar
  • jna-platform-x.x.x.jar

若使用Maven/Gradle管理依赖,直接添加对应依赖即可,避免手动引入不同版本的jar:
Maven示例:

<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>

内容的提问来源于stack exchange,提问作者Seunghun Jun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:05:33