我们在Windows中构建一个JavaFX应用程序,我们希望能够做一些事情来操纵我们的应用程序如何出现在Windows任务栏7/8。 这需要修改的Windows变量被称为“ 应用程序用户模型ID ”。
我们已经设法通过做正是我们想要在Swing JNA ,我们想重复我们在JavaFX的解决方案。 不幸的是,要做到这一点,我们需要能够检索hWnd
(窗口句柄)在我们的应用程序的每个窗口。 这可以通过JNA的Swing / AWT做Native.getWindowPointer()方法,这与工作java.awt.Window
,但我不能想出一个好办法有做到这一点javafx.stage.Window
。
有谁知道有什么方法可以做得到hWnd
一个Stage
?
下面是一个JavaFX2版本(使用阶段,而不是窗口):
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;
}
}
下面的方法演示了如何获得一个本地窗口句柄(HWND)为一个JavaFX阶段(或窗口 ),然后将其存储在JNA 指针对象:
private static Pointer getWindowPointer(javafx.stage.Window window) {
Pointer retval = null;
try {
Method getPeer = window.getClass().getMethod("impl_getPeer");
final Object tkStage = getPeer.invoke(window);
Method getPlatformWindow = tkStage.getClass().getDeclaredMethod("getPlatformWindow");
getPlatformWindow.setAccessible(true);
final Object platformWindow = getPlatformWindow.invoke(tkStage);
Method getNativeHandle = platformWindow.getClass().getMethod("getNativeHandle");
retval = new Pointer((Long) getNativeHandle.invoke(platformWindow));
} catch (Throwable t) {
System.err.println("Error getting Window Pointer");
t.printStackTrace();
}
return retval;
}
该解决方案是脆弱的,通常是不希望的,因为它使用反射来访问一堆私有方法。 但它能够完成任务。 希望甲骨文将最终给我们直接访问本地窗口句柄,所以我们没有做到这一点。
当然,当你在MS Windows上运行该代码才有效。 另外,我只尝试过了早期发行版本的JavaFX的8的(但我怀疑它会正常工作的JavaFX的2以及编辑:看起来不JavaFX中2工作)
com.sun.glass.ui.Window.getWindows.get(0).getNativeWindow
//
com.sun.glass.ui.Window.getFocusedWindow.getNativeWindow