获取Java程序的窗口句柄

我们知道C++的每个窗体都对应着一个句柄HWND,通过这个句柄我们可以对这个窗口以及它的资源进行各种操作,比如让它前端显示等。那么操作系统给Java编写的窗体(Frame或者JFrame的对象或者子类对象)有没有分配这个唯一的HWND呢?
    用spy++查看一下,Frame或者JFrame的对象或者子类对象确实都是存在这个窗口句柄的,那么我们怎么来得到它呢?
    下面就是通过JNI取得这个句柄的代码。

 1HWND GetHwndOfJavaWindow(JNIEnv *env, jobject window)
 2{
 3    cout << "GetHwndOfJavaWindow" << endl;
 4
 5    HWND hwnd = NULL;
 6
 7    JAWT_DrawingSurface *ds;
 8    JAWT_DrawingSurfaceInfo *dsi;
 9    JAWT_Win32DrawingSurfaceInfo *win;
10
11    JAWT awt;
12    awt.version = JAWT_VERSION_1_3;
13    jboolean result = JAWT_GetAWT(env, &awt);
14    if(result == JNI_TRUE)
15    {
16        ds = awt.GetDrawingSurface(env, window);
17        jint lock = ds -> Lock(ds);
18        if(lock != JAWT_LOCK_ERROR)
19        {
20            dsi = ds -> GetDrawingSurfaceInfo(ds);
21            win = (JAWT_Win32DrawingSurfaceInfo *) dsi -> platformInfo;
22            
23            hwnd = win -> hwnd;
24
25            ds -> FreeDrawingSurfaceInfo(dsi);
26            ds -> Unlock(ds);
27            awt.FreeDrawingSurface(ds);
28        }

29    }

30
31    return hwnd;
32}


有了这个窗口句柄后,我们就可以让Java窗体也具有很多本地化的功能了,比如闪烁标题栏,禁止最大化最小化以及关闭按钮等。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwpdws.html