📄 main.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 + -