听说此版牛人颇多,来问道,再发原贴,已经是第4次发同样的帖子了,希望牛人帮我解决下,给个例子什么的

huoyingyangjie 2012-11-06 06:51:29
这是原贴路径:http://bbs.csdn.net/topics/390258272;
其余的路径中也有回复,相关连接如下:
贴2:http://bbs.csdn.net/topics/390269886
贴3:http://bbs.csdn.net/topics/390269910
下面是原贴的内容:
本人现在想给本机的程序A发送一个按钮按下的消息,程序A很简单,一个窗口,窗口上有一个按钮,具体实现不知道,这个程序是用java实现的,所以不太确定这个按钮到底是不是按钮,还是图片,还是其他什么控件,不过鼠标放在上面会凹下去,90%是个按钮,由于不懂java所以提个醒。
现在我用c++写一个程序B,就是程序A运行的时候B能让A中的按钮自动按下,相信要求大家知道。实现有很多啊,网上搜了下,自己也试了下:
1.使用鼠标事件,mouse_event,这个在有鼠标在的时候还是可以的,但是鼠标一但拔了就不行了,所以果断不采用
2.使用消息sendmessage和postmessage,采用这个方式的时候就麻烦了,因为要获取句柄,为了这个问题,烦死了!我使用findwindow获取窗口句柄,然使用spy++去看,确实是一样的,然后使用postmessage发送消息,
postmessage(hwnd,wm_lbuttondown,MK_BUTTON,MAKELPARAM(x,y));
postmessage(hwnd,wm_lbuttondup,0,MAKELPARAM(x,y));

当然x,y就是那个按钮所在的相对于窗口的位置,然后通过spy++去查看,发现窗口确实收到了这个消息,但是发现窗口一点反映也没有,就好像窗口上没有这个按钮,假如我发送窗口关闭消息的话,窗口是响应的,但是发这个没反应,貌似并没有把这个消息给按钮,只是在窗口的对应位置上按了下,就等于没有按钮的感觉。然后上网去查,说要获取按钮的句柄,这就蛋疼了,不管用什么方法也获取不到,全是NULL,方法有findwindowex,getitem,getwindow,enumchildwindow等等,试了N种,没用,烦恼啊,现在望csdn的大虾们能找到解决之法,并能解释一下我那些失败地方的原因!还有就是spy++显示程序A就只有一个窗口,其他啥都没有!
...全文
267 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2012-11-11
  • 打赏
  • 举报
回复
Java 的窗体应该是得不到按钮句柄等这些的,与 DirectUI 是类似的。如果 spy 类软件都看不到,你只能借助坐标发送鼠标消息,而不能通过句柄的方式。
Eleven 2012-11-09
  • 打赏
  • 举报
回复
引用 4 楼 huoyingyangjie 的回复:
引用 2 楼 Tr0j4n 的回复:1.安装JDK和VC件并把JDK所带的头文件(jni.h jni_md.h jawt.h jawt_md.h)全部放入VC的Include目录 2.写一个Java类,JNIWindowUtilProxy,里面包含 Java code1234// 得到这个Java窗体的窗口句柄HWNDpublic static native ……
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);
}
huoyingyangjie 2012-11-09
  • 打赏
  • 举报
回复
引用 2 楼 Tr0j4n 的回复:
1.安装JDK和VC件并把JDK所带的头文件(jni.h jni_md.h jawt.h jawt_md.h)全部放入VC的Include目录 2.写一个Java类,JNIWindowUtilProxy,里面包含 Java code1234// 得到这个Java窗体的窗口句柄HWNDpublic static native int getWindowHWND(……
窗口句柄能得到啊,就是获取不到窗口中的按钮的句柄!
MoXiaoRab 2012-11-08
  • 打赏
  • 举报
回复
1.安装JDK和VC件并把JDK所带的头文件(jni.h jni_md.h jawt.h jawt_md.h)全部放入VC的Include目录 2.写一个Java类,JNIWindowUtilProxy,里面包含

// 得到这个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*);
怎么操作窗口句柄,我就不多说了。
hutao_jack 2012-11-07
  • 打赏
  • 举报
回复
把代码贴上来看看,

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧