在Java Swing中,如何获得对窗口的Win32窗口句柄(hwnd)引用?

在Java 1.4中,你可以使用((SunToolkit)Toolkit.getDefaultToolkit()).getNativeWindowHandleFromComponent()但已被删除。

看起来您现在必须使用JNI来执行此操作。您是否有 JNI 代码和示例 Java 代码来执行此操作?

我需要它来调用Win32 GetWindowLong和SetWindowLong API调用,这可以通过Jawin库完成。

我想要一些非常精确的东西,这样我就可以传递对JDialog或JFrame的引用并获取窗口句柄。

使用 JNI 的摆动透明度可能与此相关。


答案 1

您不必编写任何 C/JNI 代码。来自 Java:

import sun.awt.windows.WComponentPeer;

public static long getHWnd(Frame f) {
   return f.getPeer() != null ? ((WComponentPeer) f.getPeer()).getHWnd() : 0;
}

警告:

  • 这使用 sun.* 包。显然,这不是公共 API。但它不太可能改变(我认为比上面的解决方案更不可能崩溃)。
  • 这将仅在Windows上编译和运行。您需要将其转换为反射代码才能移植。

答案 2

这个小 JNI 方法接受窗口标题并返回相应的窗口句柄。

JNIEXPORT jint JNICALL Java_JavaHowTo_getHwnd
     (JNIEnv *env, jclass obj, jstring title){
 HWND hwnd = NULL;
 const char *str = NULL;

 str = (*env)->GetStringUTFChars(env, title, 0);
 hwnd = FindWindow(NULL,str);
 (*env)->ReleaseStringUTFChars(env, title, str);
 return (jint) hwnd;
 }

更新:

有了JNA,就容易一点了。我做了一个小例子,找到手柄并用它来使程序成为前台。


推荐