中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Delphi > 综合文章
扫雷外挂的设计与实现(四)
作者:未知 时间:2005-07-27 22:02 出处:CSDN 责编:chinaitpower
              摘要:扫雷外挂的设计与实现(四)

文/jorge

不得不说,捕获“扫雷”窗口以及取得它的数据,是本程序的一个难点。现在这个难点已经解决,接下来,完成接口层已经不是问题了。那么,来看接口层的两个核心过程:

=================================================================

//取得整个雷区每个方块的状态,填入Cells中供分析。
procedure FetchCells;
var
  i, j: Integer;
begin
  //扫描每个方块,根据指定像素的颜色判断该方块的性质。
  //特定像素的颜色与方块性质的对应关系归纳自“扫雷”程序本身的资源。
  for i:=0 to AreaWidth-1 do
  for j:=0 to AreaHeight-1 do
    //首先判断(0, 0)点的像素
    case TColor(GetPixel(MineDC, LEFT_MARGIN + i*CELL_WIDTH, TOP_MARGIN + j*CELL_HEIGHT)) of
      clWhite:
        //是未挖开的方块,再判断(5, 4)点的像素
        case TColor(GetPixel(MineDC, LEFT_MARGIN + i*CELL_WIDTH + 5, TOP_MARGIN + j*CELL_HEIGHT + 4)) of
          clSilver: Cells[i, j] := csUnknown;     //未翻开的方块
          clRed: Cells[i, j] := csMarked;           //已标记为雷的方块
          clBlack: Cells[i, j] := csPossible;      //标问号的方块
        end;
      clGray:
        //是已挖开的方块,再判断(7, 4)点的像素
        case TColor(GetPixel(MineDC, LEFT_MARGIN + i*CELL_WIDTH + 7, TOP_MARGIN + j*CELL_HEIGHT + 4)) of
          clSilver: Cells[i, j] := cs0;    //空白,相当于数字0
          clBlue: Cells[i, j] := cs1;      //数字1
          clGreen: Cells[i, j] := cs2;     //数字2
          clRed: Cells[i, j] := cs3;       //数字3
          clNavy: Cells[i, j] := cs4;      //数字4
          clMaroon: Cells[i, j] := cs5;    //数字5
          clTeal: Cells[i, j] := cs6;      //数字6
          clBlack: Cells[i, j] := cs7;     //数字7
          clGray: Cells[i, j] := cs8;      //数字8
        end;
    end;
end;

=================================================================

以上程序中,三个包含 case...of 的行,都用到了前面实测到的数据。执行完之后,扫雷窗口所有方块的状态就原原本本地在输入缓冲区里了。

=================================================================

//将Operations中所记载的对每个方块的操作真正作用于扫雷窗口。
procedure OperateCells;
var
  i, j: Integer;
  downMsg, upMsg: Cardinal;     //按下和抬起鼠标按钮时分别发送的消息
  wparam, lparam: Integer;      //消息参数
  clickCount: Integer;          //按键次数,只有取值1或2
begin
  //扫描每个方块
  for i:=0 to AreaWidth-1 do
  for j:=0 to AreaHeight-1 do
  begin
    if Operations[i, j] = opNone then
      Continue;
    //根据操作种类,设定发送的消息及其参数
    lparam := ((TOP_MARGIN + j*CELL_HEIGHT) shl 16) + (LEFT_MARGIN + i*CELL_WIDTH);
    wparam := IfThen(Operations[i, j] = opBothClick, MK_RBUTTON, 0);
    downMsg := IfThen(Operations[i, j] in [opRightClick, opRightDoubleClick], WM_RBUTTONDOWN, WM_LBUTTONDOWN);
    upMsg := IfThen(Operations[i, j] in [opRightClick, opRightDoubleClick], WM_RBUTTONUP, WM_LBUTTONUP);
    //设定发送消息次数,即单击还是双击
    clickCount := IfThen(Operations[i, j] = opRightDoubleClick, 2, 1);
    //发送消息
    repeat
      PostMessage(MineWnd, downMsg, wparam, lparam);
      PostMessage(MineWnd, upMsg, wparam, lparam);
      Dec(clickCount);
    until clickCount = 0;
  end;
end;

=================================================================

这里需要说的是WM_LBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONDOWN和WM_RBUTTONUP四个消息。它们是在一个窗口客户区内按下或抬起鼠标左或右按钮时,发给这个窗口的消息。所以,手动地发送这些消息,其实就是模拟鼠标的点击。发送消息用到了WinAPI函数PostMessage,它和大家所熟悉的SendMessage函数的参数是相同的,作用也几乎相同,主要区别是不等待消息的返回,详见MSDN。上述四个消息的WParam和LParam都具有同样的意义:WParam用来指定按下该键的时候,还有哪些其它特定的键(其它鼠标键,或Ctrl,Shift等)被按下。0表示没有其它键被按下,在这里还用到了值MK_RBUTTON,即按下左键时指定右键同时也被按下,用来模拟同时按下左右键的情况。当然,发送RBUTTONDOWN和RBUTTONUP时指定MK_LBUTTON也是同样的效果。而LParam则指定了按下或抬起键时鼠标指针的坐标,它的高16位为Y坐标,低16位为X坐标。给lparam赋值的那一行,就是把X,Y两个值组装成了一个lparam。

另外提一下IfThen函数,这个函数平时并不见有多人使用,但它真的很方便,至少它解决了对于“Delphi中没有C的 ? : 运算符”的抱怨^_^。不错,这就是Delphi的问号运算符,三个参数中第一个是Boolean型,若为真,返回值就是第二个参数,否则是第三个参数。第二、第三个参数类型相同,并且有多个重载版本。数值版本需要包含Math库,而字符串版本需要StrUtils库。显然,编译上述代码是需要包含Math库的。若不愿,当然你也可以使用 if...then。

至此,接口层全部实现完毕,接下来就可以安心的实现“数学模型”了。


关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有