2013-02-22 3 views
4

Мы создаем приложение JavaFX в Windows, и мы хотим иметь возможность делать некоторые вещи, чтобы манипулировать тем, как наше приложение появляется на панели задач Windows 7/8. Это требует изменения переменной Windows под названием «Application User Model ID».Как я могу получить дескриптор окна (hWnd) для этапа в JavaFX?

Мы уже успели сделать именно то, что хотим в Swing, используя JNA, и мы хотели бы повторить наше решение в JavaFX. К сожалению, для этого нам нужно получить hWnd (дескриптор окна) для каждого окна в нашем приложении. Это можно сделать в Swing/AWT с помощью метода JNA Native.getWindowPointer(), который работает с java.awt.Window, но я не могу найти хороший способ сделать это с помощью javafx.stage.Window.

Кто-нибудь знает, как можно получить hWnd за Stage?

+0

Не могли бы вы взглянуть на эту просьбу особенность, и сказать, содержит ли он вещи, которые интересны для вас? http://javafx-jira.kenai.com/browse/RT-24249 –

+0

@ Александр: это похоже на правильную идею, хотя я сомневаюсь, что они будут внедрять все, что позволяет нам делать то, что нам нужно, с панелью задач (мы иметь одно приложение, которое должно отображаться с несколькими значками на панели задач.) Нам действительно нужно hWnd, я думаю. Спасибо за ссылку, хотя, я добавил комментарий к этой RFE. – Xanatos

+1

Вы можете проголосовать за эту функцию, если хотите повысить ее возможность исправления. –

ответ

3

версия 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; 
    } 
} 
+0

Я не думаю, что это работает больше, по крайней мере, 1,8_66. «getPlatformWindow» больше не существует в TKStage. – robross0606

+0

Похоже, что он был перенесен в класс WindowStage. Кто-нибудь знает, как туда добраться? – robross0606

+0

Duh, WindowStage является подклассом TKStage. Метод найден через отражение, но я вызываю InvocationException при вызове метода. – robross0606

1

Следующий метод показывает, как вы можете получить родной дескриптор окна (HWND) для JavaFX стадии (или Window), а затем сохранить его в ЮНА Pointer объекта:

private static Pointer getWindowPointer(javafx.stage.Window window) { 
    Pointer retval = null; 
    try { 
     Method m = window.getClass().getMethod("impl_getPeer"); 
     final Object tkStage = m.invoke(window); 
     m = tkStage.getClass().getDeclaredMethod("getPlatformWindow"); 
     m.setAccessible(true); 
     final Object platformWindow = m.invoke(tkStage); 
     m = platformWindow.getClass().getMethod("getNativeHandle"); 
     retval = new Pointer((Long)m.invoke(platformWindow)); 
    } catch (Throwable t) { 
     System.err.println("Error getting Window Pointer"); 
    } 
    return retval; 
} 

Это решение является хрупким и в целом нежелательно, поскольку он использует отражение для доступа к кучу частных методов. Но он выполняет свою работу. Надеюсь, Oracle в конечном итоге предоставит нам прямой доступ к ручным окнам, поэтому нам не нужно это делать.

Конечно, этот код работает, только когда вы работаете в MS Windows. Кроме того, я только пробовал это с ранними версиями JavaFX 8 (но я подозреваю, что он отлично работает и на JavaFX 2. EDIT: похоже, что он не работает в JavaFX 2.)

+1

JavaFX 2 пользователь здесь. Windows 7, jdk1.7.0_21. 'm.invoke (window)' возвращает 'null'. Решение не работает. – mre

+0

Добавлена ​​версия JavaFX2 в качестве отдельного ответа. FWIW. –

+1

На самом деле, это уже версия JavaFX2. Окно - это суперкласс Stage. – Xanatos

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

//

com.sun.glass.ui.Window.getFocusedWindow.getNativeWindow 
Смежные вопросы