在Java 1.4中,你可以使用((SunToolkit)Toolkit.getDefaultToolkit()).getNativeWindowHandleFromComponent(),但它被删除了。
看起来您现在必须使用JNI来执行此操作。你有JNI代码和示例Java代码来做这件事吗?
我需要它来调用Win32 GetWindowLong和SetWindowLong API调用,这可以通过Jawin库来完成。
我想要一些非常精确的东西,这样我就可以传递一个对JDialog或JFrame的引用并获取窗口句柄。
Swing transparency using JNI可能相关。
6条答案
按热度按时间kqlmhetl1#
你不需要写任何C/JNI代码。Java:
注意事项:
9avjhtql2#
锁定,本次有disputes about this answer’s content正在解析。它目前不接受新的交互。
这个小JNI方法接受窗口标题并返回相应的窗口句柄。
iyfamqjs3#
下面的代码允许您传递一个Component以获取它的窗口句柄(HWND)。要确保组件具有相应的窗口句柄,请在组件上调用isLightWeight(),并验证它是否等于false。如果没有,则通过调用Component.getParent()来尝试它的父对象。
Java代码:
头文件main.h:
C源代码main.c:
3pmvbmvn4#
我发现了这个:http://jna.java.net/javadoc/com/sun/jna/Native.html#getWindowID(java.awt.Window)
JNA允许您调用本机库,而不必编写JNI本机代码。原来库本身有一个方法,它接受一个Window并产生一个int,可能是一个句柄(或指针?),希望能在所有平台上工作。
zynd9foi5#
在JNA库中,我们看到在Java 5和6中使用Native AWT UnsatisfiedLinkError时运行headless,因此使用动态链接。参见https://github.com/twall/jna/blob/master/native/dispatch.c中的方法
Java_com_sun_jna_Native_getWindowHandle0
。kpbpu0086#
这与Jared MacD的答案相同,但它使用反射,以便代码可以在非Windows计算机上编译和加载。当然,如果你试图调用它,它会失败。