我怎样才能得到窗口句柄(HWND)在JavaFX的一个阶段?(How can I get the w

2019-07-20 10:10发布

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

我们已经设法通过做正是我们想要在Swing JNA ,我们想重复我们在JavaFX的解决方案。 不幸的是,要做到这一点,我们需要能够检索hWnd (窗口句柄)在我们的应用程序的每个窗口。 这可以通过JNA的Swing / AWT做Native.getWindowPointer()方法,这与工作java.awt.Window ,但我不能想出一个好办法有做到这一点javafx.stage.Window

有谁知道有什么方法可以做得到hWnd一个Stage

Answer 1:

下面是一个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;
    }
}


Answer 2:

下面的方法演示了如何获得一个本地窗口句柄(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工作)



Answer 3:

com.sun.glass.ui.Window.getWindows.get(0).getNativeWindow

//

com.sun.glass.ui.Window.getFocusedWindow.getNativeWindow


文章来源: How can I get the window handle (hWnd) for a Stage in JavaFX?