¿Cómo puedo obtener el identificador de ventana “nativo” en Java para pasarlo a través de JNI a una DLL escrita en C++?
Tengo que forzar una aplicación existente de JavaFX para que esté siempre en segundo plano, pero no pude encontrar esa funcionalidad de manera nativa en JavaFX (solo existe siempre en primer plano), por lo tanto, pensé en usar la API de Win32 desde una DLL JNI externa para llamar a la función SetWindowPos()
.
Pude vincular Java con C++, pero no sé cómo obtener el identificador de ventana (HWND
) necesario para la función desde el entorno Java.
Mi llamada de ejemplo (desde la DLL):
#define X0 0
#define Y0 0
#define W 1920
#define H 1080
#define FLAGS 0
#define ALWAYS_ON_BOTTOM HWND_BOTTOM
#define I_DONT_KNOW_WHAT nullptr
JNIEXPORT void JNICALL Java_libreria_WindowsHandlerWrapper_SetAlwaysOnBottom
(JNIEnv* env, jobject obj) {
HWND hWnd = I_DONT_KNOW_WHAT; /* aquí es donde necesito ayuda */
SetWindowPos(
hWnd,
ALWAYS_ON_BOTTOM,
X0,
Y0,
W,
H,
FLAGS
);
}
Lo que no sé es cómo obtener el identificador hWnd
.
davy.ai
Para obtener el identificador nativo de ventana (
hWnd
), se puede utilizar el métodogetWindow()
de un objetoStage
en JavaFX.Así es como se puede modificar el método
JNIEXPORT
para obtener elhWnd
:“`c++
JNIEXPORT void JNICALL Java_libreria_WindowsHandlerWrapper_SetAlwaysOnBottom
(JNIEnv* env, jobject obj, jlong stagePtr) {
“`
En este ejemplo, se supone que hay un campo
jlong
llamadostagePtr
en la claselibreria.WindowsHandlerWrapper
. Este campo contiene el puntero al objetoStage
que se necesita crear y se pasa como argumento al métodoJNIEXPORT
.Luego, el puntero se convierte en un objeto
Stage
, y se utiliza el métodogetWindow()
para obtener el objetoWindow
. El métodoimpl_getNativeWindow()
del objetoWindow
devuelve el identificador nativo de ventana (HWND
).Por último, se llama a
SetWindowPos()
conHWND_BOTTOM
para que la ventana siempre permanezca en segundo plano. Se utilizan las banderasSWP_NOMOVE
,SWP_NOSIZE
ySWP_NOACTIVATE
para evitar que la ventana se mueva o cambie de tamaño, y para evitar que se active (es decir, que se traiga al primer plano) al hacer clic en ella.</stage*>