⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 斗地主源代码.Delphi编写.....
💻 PAS
字号:
// ************************************************************************
// * ******************************************************************** *
// * *                                 * *
// * *                        DDZ ++ 内存扫描版                        * *
// * *                                 * *
// * ******************************************************************** *
// * *                                 * *
// * * 特别提醒:                            * *
// * *   该代码仅供学习编程所用,我不赞成将该软件用作任何商业用途,代 * *
// * * 码可能存在不稳定现象,有兴趣的朋友不妨完善之。                   * *
// * *                                  * *
// * *                                  * *
// * *                      who&who         * *
// * *                    whoawho@qianlong.com       * *
// * *                                  * *
// * ******************************************************************** *
// ************************************************************************
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus,
  ImgList, frmInsert_P, CoolTrayIcon;

procedure Delay(msecs: Integer);

type
  TfrmMain = class(TForm)
    TrayIcon: TCoolTrayIcon;
    pmTray: TPopupMenu;
    pmExit: TMenuItem;
    N2: TMenuItem;
    pmAbout: TMenuItem;
    pmHelp: TMenuItem;
    imgPokeBmp1400: TImage;
    tmrCheckGameWin: TTimer;
    imgPokeBmp1024: TImage;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure TrayIconStartup(Sender: TObject; var ShowMainForm: Boolean);
    procedure pmExitClick(Sender: TObject);
    procedure tmrCheckGameWinTimer(Sender: TObject);
  private
    { Private declarations }
  public
    procedure InsertPanel;
    { Public declarations }
  end;

const
  //牌面数据表
  PokeTemplet: array[0..53] of Cardinal = (
    $0F00, $0E00,
    $0201, $0202, $0203, $0204,
    $0101, $0102, $0103, $0104,
    $0D01, $0D02, $0D03, $0D04,
    $0C01, $0C02, $0C03, $0C04,
    $0B01, $0B02, $0B03, $0B04,
    $0A01, $0A02, $0A03, $0A04,
    $0901, $0902, $0903, $0904,
    $0801, $0802, $0803, $0804,
    $0701, $0702, $0703, $0704,
    $0601, $0602, $0603, $0604,
    $0501, $0502, $0503, $0504,
    $0401, $0402, $0403, $0404,
    $0301, $0302, $0303, $0304
    );

var
  frmMain: TfrmMain;
  frmInsert: TfrmInsertType;
  AlreadyInsert: Boolean;
  DDZRunning: Boolean;

  hwndDest: HWND;
  RectDest: TRect;

  MyPokeWidth: Integer;                 //自绘扑克宽度
  MyPokeHeight: Integer;                //自绘扑克高度
  PanelTop: Integer;                    //插入面板的位置
  PanelHeight: Integer;                 //插入面板的高度
  ImgLeftExcursion: Integer;            //不同分辨率下左方偏移
  ImgAllOtherPokeTop: Integer;          //绘制自己手中以外所有牌面的位置
  ImgBombLineTop: Integer;              //绘制炸弹标示线的位置
  ImgBombLineExcursion: Integer;        //绘制炸弹标示线的长度修正
  ImgLineTop: Integer;                  //绘制横线的位置
  ImgLeftPokeTop: Integer;              //绘制左方牌面的位置
  ImgRightPokeTop: Integer;             //绘制右方牌面的位置

const
  ProcessName = 'DDZ.exe';              //目标进程名称
  WindowName = '斗地主';                //目标窗口名称

implementation

uses
  DataTrack;

{$R *.dfm}


{-------------------------------------------------------------------------------
  过程名:    Delay
  说明:      让程序延时,时间由msecs确定。
  作者:      who&who
  日期:      2005.03.12
  参数:      msecs: Integer
  返回值:    无
-------------------------------------------------------------------------------}
procedure Delay(msecs: Integer);
var
  FirstTickCount: Longint;
begin
  FirstTickCount := GetTickCount;
  repeat
    Application.ProcessMessages;
  until ((GetTickCount - FirstTickCount) >= Longint(msecs));
end;


{-------------------------------------------------------------------------------
  过程名:    TfrmMain.InsertPanel
  说明:      在目标窗口的子窗口中插入面板。
  作者:      who&who
  日期:      2005.03.11
  参数:      无
  返回值:    无
-------------------------------------------------------------------------------}
procedure TfrmMain.InsertPanel;
begin
  if frmInsert <> nil then
    frmInsert.Destroy;

  frmInsert := TfrmInsertType.CreateParented(hwndDest);
  frmInsert.Left := 0;
  frmInsert.Top := PanelTop;
  GetWindowRect(hwndDest, RectDest);
  frmInsert.Width := RectDest.Right - RectDest.Left;
  frmInsert.Height := PanelHeight;

  case Screen.Width of
    1024..1399:
      begin
        frmInsert.img1.Visible := False;
        frmInsert.img2.Visible := False;
        frmInsert.img3.Visible := False;
        frmInsert.lbl1.Visible := True;
        frmInsert.lbl2.Visible := True;
        frmInsert.lbl3.Visible := True;
      end;
    1400..2048:
      begin
        frmInsert.img1.Visible := True;
        frmInsert.img2.Visible := True;
        frmInsert.img3.Visible := True;
        frmInsert.lbl1.Visible := False;
        frmInsert.lbl2.Visible := False;
        frmInsert.lbl3.Visible := False;
      end;
  end;

  frmInsert.Show;

  //延迟一点时间,以便目标窗口数据初始化完毕。
  Delay(1500);

  //获取相应进程ID并扫描获取所有数据的地址
  if not GetAllDataAdr then
  begin
    //内存扫描不成功,处理;
    Self.Close;
  end;

  frmInsert.tmrWatchState.Enabled := True;
end;

procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if frmInsert <> nil then
    frmInsert.Destroy;
end;

procedure TfrmMain.TrayIconStartup(Sender: TObject; var ShowMainForm: Boolean);
begin
  ShowMainForm := False;
end;

procedure TfrmMain.pmExitClick(Sender: TObject);
begin
  Self.Close;
end;

{-------------------------------------------------------------------------------
  过程名:    TfrmMain.tmrCheckGameWinTimer
  说明:      监视目标窗口的状况,一旦发现窗口出现,立即插入面板;如果发现目标窗口消失,则关闭面板。
  作者:      who&who
  日期:      2005.03.11
  参数:      Sender: TObject
  返回值:    无
-------------------------------------------------------------------------------}
procedure TfrmMain.tmrCheckGameWinTimer(Sender: TObject);
var
  HWndDDZ, HWndTmp, HWndMaxWin: HWND;
  MaxWidth: Integer;
  TmpRect: TRect;
begin
  //根据屏幕分辨率的不同选择不同的扑克图形
  case Screen.Width of
    0..1023:
      begin
        ShowMessage('您的屏幕分辨率设置过低,无法用较为适合的方法显示,请将屏幕分辨率设置到1024*768以上。');
        Close;
      end;
    1024..1399:
      begin
        MyPokeWidth := 13;              //自绘扑克宽度
        MyPokeHeight := 21;             //自绘扑克高度
        PanelTop := 118;                //插入面板的位置
        PanelHeight := 81;              //插入面板的高度
        ImgLeftExcursion := 107;        //不同分辨率下左方偏移
        ImgAllOtherPokeTop := 6;        //绘制自己手中以外所有牌面的位置
        ImgBombLineTop := 5;            //绘制炸弹标示线的位置
        ImgBombLineExcursion := 2;      //绘制炸弹标示线的长度修正
        ImgLineTop := 28;               //绘制横线的位置
        ImgLeftPokeTop := 32;           //绘制左方牌面的位置
        ImgRightPokeTop := 54;          //绘制右方牌面的位置
      end;
    1400..2048:
      begin
        MyPokeWidth := 25;              //自绘扑克宽度
        MyPokeHeight := 35;             //自绘扑克高度
        PanelTop := 125;                //插入面板的位置
        PanelHeight := 137;             //插入面板的高度
        ImgLeftExcursion := 177;        //不同分辨率下左方偏移
        ImgAllOtherPokeTop := 14;       //绘制自己手中以外所有牌面的位置
        ImgBombLineTop := 12;           //绘制炸弹标示线的位置
        ImgBombLineExcursion := 0;      //绘制炸弹标示线的长度修正
        ImgLineTop := 49;               //绘制横线的位置
        ImgLeftPokeTop := 55;           //绘制左方牌面的位置
        ImgRightPokeTop := 90;          //绘制右方牌面的位置
      end;
  else
    ShowMessage('无法识别的屏幕分辨率。');
    Close;
  end;

  //寻找目标窗口
  HWndDDZ := FindWindow(nil, WindowName);
  //找到目标主窗口
  if (HWndDDZ <> 0) then
  begin
    //查找目标进程
    ProcessID := MyFun_GetProcessID(ProcessName);
    if ProcessID = 0 then
      //无法找到进程;
      Self.Close;

    DDZRunning := True;
    if not AlreadyInsert then
    begin
      //==================================================
      // 寻找用来插入面板的目标子窗口
      //==================================================
      HWndTmp := FindWindowEx(HWndDDZ, 0, nil, nil);
      GetWindowRect(HWndTmp, TmpRect);
      MaxWidth := TmpRect.Right - TmpRect.Left;
      HWndMaxWin := HWndTmp;

      while FindWindowEx(HWndDDZ, HWndTmp, nil, nil) <> 0 do
      begin
        HWndTmp := FindWindowEx(HWndDDZ, HWndTmp, nil, nil);
        GetWindowRect(HWndTmp, TmpRect);
        if (TmpRect.Right - TmpRect.Left) > MaxWidth then
        begin
          HWndMaxWin := HWndTmp;
          MaxWidth := TmpRect.Right - TmpRect.Left;
        end;
      end;

      if HWndMaxWin <> 0 then
      begin
        HWndTmp := FindWindowEx(HWndMaxWin, 0, nil, nil);
        GetWindowRect(HWndTmp, TmpRect);
        MaxWidth := TmpRect.Right - TmpRect.Left;
        HWndMaxWin := HWndTmp;

        while FindWindowEx(HWndDDZ, HWndTmp, nil, nil) <> 0 do
        begin
          HWndTmp := FindWindowEx(HWndDDZ, HWndTmp, nil, nil);
          GetWindowRect(HWndTmp, TmpRect);
          if (TmpRect.Right - TmpRect.Left) > MaxWidth then
          begin
            HWndMaxWin := HWndTmp;
            MaxWidth := TmpRect.Right - TmpRect.Left;
          end;
        end;
      end;

      hwndDest := HWndMaxWin;
      //==================================================
      // 以上为“寻找用来插入面板的目标子窗口”的代码段
      //==================================================

      AlreadyInsert := True;
      //在目标窗口插入自定义面板;
      InsertPanel;
    end;
  end
  //目标窗口关闭
  else
  begin
    DDZRunning := False;
    GameState := GameStop;
    if AlreadyInsert and (frmInsert <> nil) then
    begin
      frmInsert.tmrWatchCard.Enabled := False;
      frmInsert.Close;
    end;
    AlreadyInsert := False;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -