如何在 JavaFX 中获取舞台的窗口句柄 (hWnd)?

Xan*_*tos 5 java hwnd jna javafx-2 javafx-8

我们正在 Windows 中构建一个 JavaFX 应用程序,我们希望能够做一些事情来操纵我们的应用程序在 Windows 7/8 任务栏中的显示方式。这需要修改名为“应用程序用户模型 ID ”的 Windows 变量。

我们已经通过使用JNA成功地在 Swing 中完成了我们想要的,我们想在 JavaFX 中重复我们的解决方案。不幸的是,要做到这一点,我们需要能够检索hWnd应用程序中每个窗口的(窗口句柄)。这可以通过 JNA Native.getWindowPointer()方法在 Swing/AWT 中完成,该方法java.awt.Windowjavafx.stage.Window.

有没有人知道有什么方法可以获取hWnda Stage

joh*_*384 5

添加对 JNA 的依赖:

<dependency>
  <groupId>net.java.dev.jna</groupId>
  <artifactId>jna-platform</artifactId>
  <version>5.3.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后给你Stage一个独特的标题(本例中为“MyStage”),然后获取窗口 ID,如下所示:

WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, "MyStage");

long wid = Pointer.nativeValue(hwnd.getPointer());
Run Code Online (Sandbox Code Playgroud)

无论 JavaFX 版本如何,这都适用于 Windows。


Cra*_*Day 3

这是 JavaFX2 版本(使用 Stage 而不是 Window):

private static Pointer getWindowPointer(Stage stage) {
    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;
    }
}
Run Code Online (Sandbox Code Playgroud)