是否有可能在Java 9中获得JavaFX窗口的HWND?

时间:2016-07-03 22:54:13

标签: java jna window-handles java-9 bridj

Java 9将限制对私有API的任何访问。这意味着使用Reflection检索窗口hwnd的已知方法不再适用。

还有办法让他们?我问,因为我有一个库,提供用于操作任务栏的API(以Java9提供的类似方式)。 Java 9 API仍然适用于AWT,所以我希望我可以为Java 9和JavaFX设置项目。

我曾经只是调用私有方法,但这将停止工作。 任何解决方案都很受欢如果可以使用JNA或BridJ完成本机调用。

1 个答案:

答案 0 :(得分:0)

一种方法是在JDK9之前对已经建议的solutionHow can I get the window handle (hWnd) for a Stage in JavaFX?进行更改: -

try {
    TKStage tkStage = stage.impl_getPeer();
    Method getPlatformWindow = tkStage.getClass().getDeclaredMethod("getPlatformWindow" );
    getPlatformWindow.setAccessible(true);
    Object platformWindow = getPlatformWindow.invoke(tkStage);
    Method getNativeHandle = platformWindow.getClass().getMethod( "getNativeHandle" );
    getNativeHandle.setAccessible(true);
    Object nativeHandle = getNativeHandle.invoke(platformWindow);
    return new Pointer((Long) nativeHandle);
} catch (Throwable e) {
    System.err.println("Error getting Window Pointer");
    return null;
}

module-info.java有点像:

module your.module {
    requires javafx.graphics;
}

但是由于javax.graphics将包内部导出到特定模块:

exports com.sun.javafx.tk to
    javafx.controls,
    javafx.deploy,
    javafx.media,
    javafx.swing,
    javafx.web;

您可以尝试添加编译器选项以仍然将其用作

--add-exports javax.graphics/com.sun.javafx.tk=your.module

注意/小计: 免责声明来自 JEP-261:Module System -

  

必须使用--add-exports--add-opens选项   关心。您可以使用它们来访问库的内部API   模块,甚至JDK本身,但你这样做需要您自担风险:如果   内部API被更改或删除,然后您的库或   申请将失败。