mythxhg 发表于 2007-11-19 16:23:37

大家进来讨论一下关于WINRUNNER使用WINDOWS API控制程序的问题.

不知道各位有没用WINRUNNER获取HANDLE后使用PostMessageA结合VC的SPY++来编写使用消息控制的自动化测试.
load_dll ("user32.dll");
extern int PostMessageA(in long, in long, in long, in long);
extern int BroadcastSystemMessage........
invoke_application("C:\\MoiSystem.exe","","",SW_SHOW);
win_get_info("MOIS","handle",hWnd);       
PostMessageA(hWnd, WM_CHAR, 00000041, C01E0001);

WINDOWS上运行的程序都是基于消息机制的,就是窗口有一个消息循环来等待接收消息并分发给下面处理.我们在用MFC写窗口程序的时候就经常用到SENDMESSAGE来通知和处理各种操作.我觉得程序代码里和WINRUNNER这里使用WIN API调用的原理是一样的.
所以理论上我觉得既然WINRUNNER能拿到具体的HANDLE,并且用SPY++能拿到发送的消息的具体内容,那么应该就能通过POSTMESSAGEA和WINDOWS 的其他API函数来发送控制指令实现对程序的控制,不过我试验后发现只有一些简单的CLOSE等消息可以响应,其他通过SPY++拿到的消息放到代码里运行发现很多是无效的.

希望大家分享一下这方面的经验.

[ 本帖最后由 mythxhg 于 2007-11-19 16:25 编辑 ]

lantianwei 发表于 2007-11-19 17:05:29

1.你想做出什么样的效果啊?
2.其实WQINDOWS平台上的自动化工具就是利用WINDOWS的消息机制实现的,所以说你上面的做法应该是可以的,估计是你的用法不对.

mythxhg 发表于 2007-11-20 09:31:14

效果是就是对哪些OBJ类型的对象操作啊,因为WINRUNNER提供的一些函数可操作性比较低,所以打算用这种方式对付拿些比较难处理的OBJ类型的GUI对象.

听君一言胜读十年书,明白了WINDOWS自动化工具的工作原理了.:victory:

lantianwei 发表于 2007-11-20 10:06:36

如果你没有 非常强的C++功底,我劝你不要自己开发底层函数,因为这么做非常的难.再说MI开发WR的开发人员都是专家,WR出来也有快20年了,如果可以被你简简单单的搞出来了,那他们还混什么啊?如果你想开发一些WR不支持的功能,到可以试试,但如果你想加强WR已有的功能,可以说相当的难,可能有时发一些简单的消息的做不了的,要涉及到HOOK,内存什么的,非常的复杂.如果想增强WR现有的函数,可以用WR本身来重写一下,倒不错!

mythxhg 发表于 2007-11-21 11:18:21

虽然不强,但是功底还是有点,以前我是自己写代码遍历查找句柄和发送消息给窗口,不过后来发现WINRUNNER可以直接获取到对象的HANDLE,所以打算直接用WINRUNNER来获取HANDLE后调用外部的API来进行控制.这样省力省心.其实用MFC技术写过窗口程序的都知道WINDOWS下的无非就是消息.基本上窗口与外部的接口就是消息.钩子和内存等这些只是铅在其内部操作里面的,只要给到窗口消息,那窗口下的处理代码自然会响应该响应的动作,例如内存操作,HOOK就更不用说了.

当然也可能我自己比较天真,因为我自己写的代码自己明白要做什么才能控制到,如果是别人的程序,而且代码也没有的话我就没辄了,所以我只能用VC++的SPY++来看具体的消息内容.SPY++其实功能强大,基本上所有到达指定句柄的消息都可以显示出来,只是不知道我哪里用错。:)

hnp2008 发表于 2008-8-20 18:05:19

支持一下,楼主这个想法实现的怎么了

WINRUNNER使用WINDOWS API控制程序的问题解决的怎么样了,不知道楼主能否分享一下

byya 发表于 2008-8-22 12:47:20

load_dll("user32.dll");

extern long IsWindowVisible(long);
extern long FindWindowA(string,string);
public function ni_win_wait_disapear(winClass,winName)
{

auto handle;
handle = FindWindowA(winClass,winName);

if(handle == 0) return 0;
else
{
return 1;
}

}
页: [1]
查看完整版本: 大家进来讨论一下关于WINRUNNER使用WINDOWS API控制程序的问题.