以下代码适用于 Windows 上的 JavaFX 11(我只需要它)。我没有在任何其他版本中测试过它。
它非常脆弱,但在我的情况下是可以管理的,因为我将 Java 运行时与应用程序捆绑在一起,所以我总是知道下面是什么。
如果您使用 Java 9 模块,您还需要打开调用模块的包:
--add-opens javafx.graphics/javafx.stage=com.example
和--add-opens javafx.graphics/com.sun.javafx.tk.quantum=com.example
package com.example;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef;
import javafx.stage.Stage;
import javafx.stage.Window;
import java.lang.reflect.Method;
public class FXWinUtil {
public static WinDef.HWND getNativeHandleForStage(Stage stage) {
try {
final Method getPeer = Window.class.getDeclaredMethod("getPeer", null);
getPeer.setAccessible(true);
final Object tkStage = getPeer.invoke(stage);
final Method getRawHandle = tkStage.getClass().getMethod("getRawHandle");
getRawHandle.setAccessible(true);
final Pointer pointer = new Pointer((Long) getRawHandle.invoke(tkStage));
return new WinDef.HWND(pointer);
} catch (Exception ex) {
System.err.println("Unable to determine native handle for window");
return null;
}
}
}
如果您使用的是 JNA(如果您正在做类似这样的骇人听闻的事情,这很可能),您也可以从WinDef.HWND
.