|
发表于 2011-10-11 22:34:48
|
显示全部楼层
本帖最后由 编程 于 2011-10-16 21:40 编辑
{:soso_e179:} 楼主很强,附小修改后的代码,供参考
import key;
import mouse;
import process;
import winex;
import win.ui;
/*DSG{{*/
var winform = win.form( text="aardio Form";right=346;bottom=138 )
winform.add(
btnCall={ bottom=88;text="Call自动扫雷";left=187;top=49;z=2;right=291;cls="button" };
btnMouse={ bottom=88;text="鼠标自动扫雷";left=52;top=49;z=1;right=156;cls="button" }
)
/*}}*/
var CALLADDR = 0x010037E1 //call地址
var DATABASE = 0x1005340 //棋盘基址
var SETBASE = 0x01005330 //设置基址+0:雷点个数 +4:棋盘宽 +8:棋盘高
var XYBASE = 0x01005118 //call参数:XYBASE:x XYBASE+4:y
sweeper = function(byMouse){
var prc = process("winmine.exe") //创建扫雷进程
//这里最好指定进程ID,不然会找到你刚发的贴子窗口,因为浏览器标题栏也有"扫雷"这几个字
hwnd = winex.waitVisible( "<扫雷>|<Minesweeper>",,,,,prc.id ); //获取窗口句柄
win.setForeground(hwnd) //外部进程最好用这个函数
var x,y,cx,cy=win.getPos(hwnd); //获取窗口坐标
var width = prc.readNumber(SETBASE+4,"INT")
var height = prc.readNumber(SETBASE+8,"INT")
var Act_c = prc.remoteApi("void()", CALLADDR); //获取远程call
for(j=1;height){
for(i=1;width) begin
var n = prc.readNumber(DATABASE+i+32*j,"byte") //棋盘基址+x+y*32=棋盘点的值
// 未点击时:无雷:0f;;;有雷,8f (有用) 点击后:无雷:4x,x=周围雷的个数;;;有雷8x
if(n==0x0f) {
if(byMouse){
mouse.move(x+4+16*i,y+96+16*j,true); //移动到坐标点
mouse.click();
win.delay(10); //加点延时,不然太快完成看不到过程
}
else {
prc.writeNumber(XYBASE,i,"INT") //写X坐标
prc.writeNumber(XYBASE+4,j,"INT") //写Y坐标
Act_c();//点击函数
win.delay(100); //加点延时,不然太快完成看不到过程
}
};
end;
}
prc.free(); //释放句柄
}
winform.btnCall.oncommand = function(){
sweeper(false)
}
winform.btnMouse.oncommand= function(){
sweeper(true)
}
winform.show();
import win.version
if( ! win.version.isXp ) {
winform.msgboxErr("此程序仅用于XP系统扫雷游戏")
winform.btnCall.disabled=true;
winform.btnMouse.disabled=true;
}
win.loopMessage();
|
|