15,979
社区成员
发帖
与我相关
我的任务
分享
HWND hButton = FindWindowEx(HWND_PARENT, NULL, _T("Button"), ...);
if(NULL != hButton)
{
UINT nId = GetDlgCtrlId(hButton);
PostMessage(HWND_PARENT, WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hButton);
}
// 得到这个Java窗体的窗口句柄HWND
public static native int getWindowHWND(String jawtpath,
Frame target);
这个方法
3.编译上面的java文件并使用javah JNIWindowUtilProx命令生成其对应的.h头文件
#include <jni.h>
/* Header for class JNIWindowUtilProxy */
#ifndef _Included _JNIWindowUtilProxy
#define _Included _JNIWindowUtilProxy
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: JNIWindowUtilProxy
* Method: flashTaskTitle
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_JNIWindowUtilProxy_flashTaskTitle
(JNIEnv *, jclass, jint);
/*
* Class: JNIWindowUtilProxy
* Method: getWindowHWND
* Signature: (Ljava/lang/String;Ljava/awt/Frame;)I
*/
JNIEXPORT jint JNICALL Java_JNIWindowUtilProxy_getWindowHWND
(JNIEnv *, jclass, jstring, jobject);
#ifdef __cplusplus
}
#endif#endif
4.编写一个C++源文件来具体实现头文件中的getWindowHWND
//定义下面四个结构体(与图形绘制相关)的一个对象以备后面之用
JAWT awt;
JAWT_DrawingSurface *ds;
JAWT_DrawingSurfaceInfo *dsi;
JAWT_Win32DrawingSurfaceInfo *win;
//加载jawt.dll这个动态链接库(采用运行时加载的方式)
/*加载动态链接库时而要提供它的路径,也就是Java文件中的jawtpath那个参数,而在C++中对应的是jstring,由于jawt.dll是位于JRE目录的bin目录里,所以我们的jawtpath应该用下面的方法来赋值*/
jawtpath = System.getProperty("java.home")
+ System.getProperty("file.separator")
+ "bin"
+ System.getProperty("file.separator")
+ "jawt.dll";
//加载动态链接库的具体代码如下
// Load the jawt dynamic library.
const char *path = env -> GetStringUTFChars(jawtpath, JNI_FALSE);
HMODULE HJAWT = LoadLibrary(path);
env -> ReleaseStringUTFChars(jawtpath, path);
if(HJAWT == NULL)
{
return -1;
}
//得到动态链接库中JAWT_GetAWT这个函数以初始化JAWT
// Get the function address from jawt.dll
GETAWT JAWT_GetAWT =
(GETAWT) GetProcAddress(HJAWT, "_JAWT_GetAWT@8");
if (JAWT_GetAWT == NULL)
{
return -1;
}
//利用上一步提到的函数来初始化JAWT
// Get the JAWT
awt.version = JAWT_VERSION_1_3;
result = JAWT_GetAWT(env, &awt);
if (result == JNI_FALSE)
{
return -1;
}
//得到与图形绘制相关的对象
ds = awt.GetDrawingSurface(env, window);
ds -> Lock(ds);
dsi = ds -> GetDrawingSurfaceInfo(ds);
//得到JAWT_Win32DrawingSurfaceInfo 员hwnd的值
HWND hwnd = win -> hwnd;
//释放所用的资源
ds->FreeDrawingSurfaceInfo(dsi);
ds->Unlock(ds);
awt.FreeDrawingSurface(ds);
FreeLibrary(HJAWT);
//返回刚才得到的HWND对象
return (int)hwnd;
通过上面的几步就可以得到Java窗口的句柄了,得到了之后就可以通过它来操作这个窗口了
如果你的VC工程编译失败,请在前面加上下面一行代码
typedef jboolean (JNICALL *GETAWT)(JNIEnv*, JAWT*);
怎么操作窗口句柄,我就不多说了。