如何在JavaFX中获得Stage的窗口句柄(hWnd)?

如何在JavaFX中获得Stage的窗口句柄(hWnd)?,java,javafx-2,jna,javafx-8,hwnd,Java,Javafx 2,Jna,Javafx 8,Hwnd,我们正在Windows中构建一个JavaFX应用程序,我们希望能够做一些事情来操纵我们的应用程序在Windows7/8任务栏中的显示方式。这需要修改名为“”的Windows变量 通过使用,我们已经成功地在Swing中实现了我们想要的功能,我们希望在JavaFX中重复我们的解决方案。不幸的是,要做到这一点,我们需要能够检索应用程序中每个窗口的hWnd(窗口句柄)。这可以通过JNA方法在Swing/AWT中完成,JNA方法与java.AWT.Window一起工作,但是我无法找到一个好的方法来使用ja

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

通过使用,我们已经成功地在Swing中实现了我们想要的功能,我们希望在JavaFX中重复我们的解决方案。不幸的是,要做到这一点,我们需要能够检索应用程序中每个窗口的
hWnd
(窗口句柄)。这可以通过JNA方法在Swing/AWT中完成,JNA方法与
java.AWT.Window
一起工作,但是我无法找到一个好的方法来使用
javafx.stage.Window
实现这一点


是否有人知道如何为
阶段
获取
hWnd

以下方法显示了如何为JavaFX阶段(或)获取本机窗口句柄(hWnd),然后将其存储在JNA对象中:

这种解决方案是脆弱的,通常不受欢迎,因为它使用反射来访问一组私有方法。但它完成了任务。希望Oracle最终能让我们直接访问本机窗口句柄,这样我们就不必这么做了

当然,此代码仅在MS Windows上运行时有效。另外,我只在JavaFX8的早期版本中试用过它(但我怀疑它在JavaFX2上也能正常工作。编辑:看起来它在JavaFX2中不起作用。)

这里有一个JavaFX2版本(使用阶段而不是窗口):

//


添加对JNA的依赖项:

<dependency>
  <groupId>net.java.dev.jna</groupId>
  <artifactId>jna-platform</artifactId>
  <version>5.3.1</version>
</dependency>

无论JavaFX版本如何,这都可以在Windows上运行。

您能否查看此功能请求,并询问它是否包含您感兴趣的内容@Alexander:这似乎是一个正确的想法,尽管我怀疑他们是否会实现任何让我们在任务栏上做我们需要做的事情(我们有一个应用程序,需要在任务栏上显示几个不同的图标)。我想我们确实需要hWnd。谢谢你的链接,我已经在RFE中添加了一条评论。如果你想提高该功能成为fixed.javaFX2用户的可能性,你可以投票支持该功能。Windows 7,jdk1.7.0_21
m.invoke(窗口)
返回
null
。解决方案不起作用。添加了JavaFX2版本作为单独的答案。实际上,这已经是JavaFX2版本了。Window是Stage的一个超类。我认为这在至少1.8_66时不再有效。“getPlatformWindow”似乎不再存在于TKStage中。它似乎已被移动到WindowStage类中。有人知道怎么去吗?嗯,WindowsStage是TKStage的一个子类。这个方法是通过反射找到的,但是我在调用这个方法时遇到了一个调用异常。这对我来说很有效。没有反射,没有额外的依赖,只是一个简单的调用方法。
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;
    }
}
com.sun.glass.ui.Window.getWindows.get(0).getNativeWindow
com.sun.glass.ui.Window.getFocusedWindow.getNativeWindow
<dependency>
  <groupId>net.java.dev.jna</groupId>
  <artifactId>jna-platform</artifactId>
  <version>5.3.1</version>
</dependency>
WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, "MyStage");

long wid = Pointer.nativeValue(hwnd.getPointer());