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

在Java

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

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

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

我想要非常精确的内容,因此可以将引用传递给JDialog或JFrame并获取窗口句柄。

回答:

以下代码使您可以传递Component以获得其窗口句柄(HWND)。要确保Component具有相应的窗口句柄,请在Component上调用isLightWeight()并验证其等于false。如果不是,请通过调用Component.getParent()尝试将其作为父项。

Java代码:

package win32;

public class Win32 {

public static native int getWindowHandle(Component c);

}

头文件main.h:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class win32_Win32 */

#ifndef _Included_win32_Win32

#define _Included_win32_Win32

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: win32_Win32

* Method: getWindowHandle

* Signature: (Ljava/awt/Component;Ljava/lang/String;)I

*/

JNIEXPORT jint JNICALL Java_win32_Win32_getWindowHandle

(JNIEnv *, jclass, jobject);

#ifdef __cplusplus

}

#endif

#endif

C语言源main.c:

#include<windows.h>

#include <jni.h>

#include <jawt.h>

#include <jawt_md.h>

HMODULE _hAWT = 0;

JNIEXPORT jint JNICALL Java_win32_Win32_getWindowHandle

(JNIEnv * env, jclass cls, jobject comp)

{

HWND hWnd = 0;

typedef jboolean (JNICALL *PJAWT_GETAWT)(JNIEnv*, JAWT*);

JAWT awt;

JAWT_DrawingSurface* ds;

JAWT_DrawingSurfaceInfo* dsi;

JAWT_Win32DrawingSurfaceInfo* dsi_win;

jboolean result;

jint lock;

//Load AWT Library

if(!_hAWT)

//for Java 1.4

_hAWT = LoadLibrary("jawt.dll");

if(!_hAWT)

//for Java 1.3

_hAWT = LoadLibrary("awt.dll");

if(_hAWT)

{

PJAWT_GETAWT JAWT_GetAWT = (PJAWT_GETAWT)GetProcAddress(_hAWT, "_JAWT_GetAWT@8");

if(JAWT_GetAWT)

{

awt.version = JAWT_VERSION_1_4; // Init here with JAWT_VERSION_1_3 or JAWT_VERSION_1_4

//Get AWT API Interface

result = JAWT_GetAWT(env, &awt);

if(result != JNI_FALSE)

{

ds = awt.GetDrawingSurface(env, comp);

if(ds != NULL)

{

lock = ds->Lock(ds);

if((lock & JAWT_LOCK_ERROR) == 0)

{

dsi = ds->GetDrawingSurfaceInfo(ds);

if(dsi)

{

dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;

if(dsi_win)

{

hWnd = dsi_win->hwnd;

}

else {

hWnd = (HWND) -1;

}

ds->FreeDrawingSurfaceInfo(dsi);

}

else {

hWnd = (HWND) -2;

}

ds->Unlock(ds);

}

else {

hWnd = (HWND) -3;

}

awt.FreeDrawingSurface(ds);

}

else {

hWnd = (HWND) -4;

}

}

else {

hWnd = (HWND) -5;

}

}

else {

hWnd = (HWND) -6;

}

}

else {

hWnd = (HWND) -7;

}

return (jint)hWnd;

}

以上是 在Java Swing中,如何获得对窗口的Win32窗口句柄(hwnd)引用? 的全部内容, 来源链接: utcz.com/qa/428406.html

回到顶部