论坛限制,第一次只能放100分,我马上会追加100分的,大家放心.
问题是这样的,比如现在我们有一个非常简单的delphi界面,界面中只有一个"确定"按钮.那么对于这样的一个界面,有什么方法可以获取到这个确定按钮在屏幕中的位置?之前在其他版块提过这样的问题,但是这里用DELPHI的人比较多.
补充一点,假设我们是不能修改那个界面的代码的,甚至都不能看到,假设那就是一个完全编译过的exe程序(不能反编译,更无法重新编译),有没有办法获取到那个按钮在屏幕中的坐标?任何手段都可以,哪怕是再写一段delphi代码,或者第三方脚本,控件,框架,甚至于一个思路都可以.
先谢谢大家了.

解决方案 »

  1.   

    有办法
    先用findWindow找到句柄
    然后在使用
    GetWindowRect函数,就可以获得按钮的位置了
      

  2.   

    楼上的兄弟,如果这个界面是别人已经编译好的exe程序发给你,你没有它的源代码,那么你所说的方法依然奏效吗?
      

  3.   

    应该是先找到窗体---findwindow,然后再用findWindowEx根据类名TButton查找,取得返回的handle,再用getwindowRec。
      

  4.   

    上面几位正解!如果楼主搞过纯API窗体程序,那么这个问题肯定就明白了。
    这些控件在建立的时候,都需要有一个类名,只不过这个过程VCL替你做了,如果用VC的Spy++就可以看出来。
    那么想找回去自可按图索骥,一路杀回!
    锦上添花而已~飘过
      

  5.   

    假如别人已经编译好的exe的窗体名为Form1var
      h,ch:THandle;
      rect:TRect;
    begin
      h := FindWindow(nil,'Form1');//找到Form1的句柄
      ch := FindWindowEx(h,0,'TButton',nil);//找到Form1中的Button句柄
      GetWindowRect(ch,rect);//将Button的坐标保存到rect
    end;
      

  6.   

    顶,这是一种方法,还有就是得到窗体句柄之后,遍历其上的每一个控件,并判断类名是否是Button。之后在使用getwindowRec
    由于对Delphi不是很熟悉,所以VC范例如下://取得句柄
    hWnd = ::FindWindow(NULL, "GetTextTest");
    if(hWnd != NULL){
    hChildWnd = ::GetWindow(hWnd, GW_CHILD);
    while(hChildWnd){
    CHAR szClassName[MAX_PATH];
    //获得类名(Delphi可能有更简洁的方法)
    ::GetClassNameA(hChildWnd, szClassName, sizeof(szClassName)/sizeof(CHAR));
    //判断(Delphi可能有字符串string类,所以判断更简单)
    if(stricmp(szClassName, "Button") == 0){
    //取得Button的Text值
    ::GetWindowText(hChildWnd, szClassName, sizeof(szClassName)/sizeof(CHAR));
    //之后可以使用 getwindowRec API进行处理
    }
    hChildWnd = ::GetNextWindow(hChildWnd, GW_HWNDNEXT);
    }以上,由于个人能力有限所以在Delphi版只能提供VC范例,十分抱歉!
    如果有问题,还请各位指正!谢谢!
      

  7.   


    這個東西如上面所說的一樣。剛開始可以通過SPY++ 這類工具查下,它的類名,然後再通FINDWINDOW定位程序,再定位FINDWINDOWEX定位窗口內的控件,再取得
    GetWIndowRect,
     你可以通過 getWindowtext,SetWindowText  來讀取或重寫這個BUTTON的CAPTION。
     你貼子改個名字吧,剛進來,以為是搞圖形識別,樂了我半天。
      

  8.   

    踩一下.不管是把窗口移动过来,还是把鼠标移动过去,不都得先把delphi控件的坐标获取出来嘛,呵呵.
    这个问题的解决思路现在基本上已经清晰了,我现在正在看有关dll编程的资料,准备把识别的代码封装成一个dll文件,然后让JAVA去调用,其实也是jni的套路(jni也是要从最基础的部分开始看滴,还得学一下关于windows编程的知识),崩溃~!
    唉,自动化测试的过程其实就是在一次又一次的崩溃中,仍然坚持前进的过程.
      

  9.   

    如果直接发消息的话,可能还要涉及到delphi的消息处理机制,我现在对DELPHI是一窍不通,所以对DELPHI界面的识别和处理越简单越好,这才想到用控件坐标的方式来实现点击的.