次のコードは、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
。