我们知道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窗体也具有很多本地化的功能了,比如闪烁标题栏,禁止最大化最小化以及关闭按钮等。