如何获取 Java 中的"native"窗口句柄,以通过 JNI 传递到编写C++ DLL?



我必须强制现有的JavaFX应用程序";总是在背景中";,但我无法在JavaFX中找到该功能(仅始终存在于顶部(,因此我想使用外部JNI DLL中的Win32 API来调用SetWindowPos()函数。

我能够将Java链接到C++,但我不知道如何从Java环境中获得函数所需的本机窗口句柄(HWND(。

我的示例调用(来自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; /* here is where I need help*/
SetWindowPos(
hWnd,
ALWAYS_ON_BOTTOM,
X0,
Y0,
W,
H,
FLAGS
);
}

我不知道的是如何获得hWnd句柄。

我就是这么做的:
0>我设置了舞台的标题(MyApp的名称(
1>我将标题作为wstring传递(硬编码(到dll
2>我使用windows的getHwndAPI按标题搜索我的进程是什么
3>我终于得到了所需的HWND

//I had to call this in the C++ to get the HWND from the title
HWND getHwnd(std::wstring title) {
HWND hwnd = NULL;
hwnd = FindWindow(NULL,title.c_str());
return hwnd;
}

电话变成了:

#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 = getHwnd(L"My App's name");

SetWindowPos(
hWnd,
wpos,
x0,
y0,
w,
h,
FLAGS
);
}

我不喜欢我必须依赖用户可以看到的东西(标题(,但目前,它解决了我的问题。

最新更新