我编了一个围棋连线程序,可以比较两款围棋软件的棋力,让它们自动下棋,我在一旁观看。我主要用Canvas.Pixels[x,y]来捕获软件的行棋点。捕获前,我用SetForegroundWindow(handle)把行棋窗口置顶,用SetCursorPos(x,y)走子,然后等待。
    现在遇到一个问题,设置等待的时间。等待的时间太短,软件还没行棋,返回本程序的话,围棋软件就停止不动了,本程序也挂了。等待的时间太长,虽然不会有问题,但是太浪费时间。    当我用SetForegroundWindow(handle)函数把其中一个围棋软件窗口设为当前窗口,并且用模拟鼠标按键的方式走子后,在等待软件走子的过程中,如何能捕捉了它已经走子,然后返回连线程序,而不一定非要等待固定的时间呢?   围棋软件1 <-------> 连线程序<-------->围棋软件2  SetForegroundWindow(hd);     //将某一围棋进程设为当前进程;
  ……
  SetCursorPos(x,y);//先指定鼠标点击的坐标
  mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//左键按下
  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//左键起来
  sleep(20000);  //等等20秒,等围棋软件思考并走子。
  ……?
  Application.BringToFront;//这个句子必须要在当前围棋进程已经走子才有效,否则程序就挂了。
  a[m,n] := Canvas.Pixels[px,py];
  ……  我要修改的就是sleep(20000)这一句。如果我能判断出当前围棋进程已经走子了,就不再继续等待而执行下一句了。  有兴趣的编程高手可以进来参与讨论一下么?

解决方案 »

  1.   

    不懂你的机制,仅仅就sleep(20000)
    可以写个函数:
    mysleep(ms)
    begin
      while ms>0 do
      begin
        sleep(100);
        application.processmessages;
        dec(ms,100);
      end;
    end;
      

  2.   


    简单一点说,Delphi编的程序监控另一围棋进程已经落子?
      

  3.   

    Delphi编的程序能不能监控另一围棋进程已经落子?
      

  4.   

    如果是我作,我会选择以下方法之一
    1.一般来讲,对方的程序会这么设计,
      计算该走哪个位置(var 位置...)
      显示棋子(位置...)
      Hook显示位置即可,这需要调试目标程序找到Hook点
    2.通过内存搜索软件,搜索棋面的位置表,这个肯定有的,而且通常会是固定地址(就是全局变量)
      围棋软件,90%都是定义的19*19个byte来保存
      搜索到之后,通过ReadProcessMemory比较一下即可知道当前棋面的情况
      

  5.   

    谢谢楼上各位热心的跟贴,我找到解决的办法,也跟各位分享一下。用的方法就是楼上两位介绍的方法:截棋盘图,然后比较图片的变化。不过,我觉得kiboisme介绍方法也有道理,如果能实现的话,效率应该比截图比较的方法要高。等我试试,暂时先不结贴,让大家重点讨论一下kiboisme的方法后再结。