我编了一个围棋连线程序,可以比较两款围棋软件的棋力,让它们自动下棋,我在一旁观看。我主要用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)这一句。如果我能判断出当前围棋进程已经走子了,就不再继续等待而执行下一句了。 有兴趣的编程高手可以进来参与讨论一下么?
现在遇到一个问题,设置等待的时间。等待的时间太短,软件还没行棋,返回本程序的话,围棋软件就停止不动了,本程序也挂了。等待的时间太长,虽然不会有问题,但是太浪费时间。 当我用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)这一句。如果我能判断出当前围棋进程已经走子了,就不再继续等待而执行下一句了。 有兴趣的编程高手可以进来参与讨论一下么?
解决方案 »
- 请问,怎样把网络上一个电脑中的共享文件复制到本地硬盘上?
- DELPHI 的网络通信是不是要用到SPComm.dcu spcomm.pas 怎样进行spcomm 的安装?
- 请教解线性方程组!
- 昨晚和MM去江滨公园玩,好开心呀,散分啦
- 求救: delphi+mapx4.5+sqlserver 300分 在线等待!
- 关于TreeView中结点的唯一性问题!
- 请问怎样把pagecontrol固定住,禁止翻页功能!
- 关dll程序中可用的参数类型,可否用自定义类?可否用动态数组?可否申明成引用型(var)?另外可否在dll中操作文件?
- 关于获取句柄的问题
- abc6d6c 是最好的包,大家快找,下。
- 求职:delphi研发,亲,有兴趣吗
- 这个线程代码是什么问题?怎么在执行线程中退出线程后不能重新开始执行任务了?
可以写个函数:
mysleep(ms)
begin
while ms>0 do
begin
sleep(100);
application.processmessages;
dec(ms,100);
end;
end;
简单一点说,Delphi编的程序监控另一围棋进程已经落子?
1.一般来讲,对方的程序会这么设计,
计算该走哪个位置(var 位置...)
显示棋子(位置...)
Hook显示位置即可,这需要调试目标程序找到Hook点
2.通过内存搜索软件,搜索棋面的位置表,这个肯定有的,而且通常会是固定地址(就是全局变量)
围棋软件,90%都是定义的19*19个byte来保存
搜索到之后,通过ReadProcessMemory比较一下即可知道当前棋面的情况