升级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.jarjna-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
相关产品推荐
相关产品推荐

