獲取Java程序的窗口句柄
我們知道C++的每個窗體都對應著一個句柄HWND,通過這個句柄我們可以對這個窗口以及它的資源進行各種操作,比如讓它前端顯示等。那么操作系統給Java編寫的窗體(Frame或者JFrame的對象或者子類對象)有沒有分配這個唯一的HWND呢?
用spy++查看一下,Frame或者JFrame的對象或者子類對象確實都是存在這個窗口句柄的,那么我們怎么來得到它呢?
下面就是通過JNI取得這個句柄的代碼。
有了這個窗口句柄后,我們就可以讓Java窗體也具有很多本地化的功能了,比如閃爍標題欄,禁止最大化最小化以及關閉按鈕等。
用spy++查看一下,Frame或者JFrame的對象或者子類對象確實都是存在這個窗口句柄的,那么我們怎么來得到它呢?
下面就是通過JNI取得這個句柄的代碼。
1
HWND 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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

有了這個窗口句柄后,我們就可以讓Java窗體也具有很多本地化的功能了,比如閃爍標題欄,禁止最大化最小化以及關閉按鈕等。
posted on 2010-02-10 11:15 凱子 閱讀(5926) 評論(2) 編輯 收藏 所屬分類: JNI