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.Window与javafx.stage.Window.
有没有人知道有什么方法可以获取hWnda Stage?
添加对 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。
这是 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)
| 归档时间: |
|
| 查看次数: |
6349 次 |
| 最近记录: |