开发背景:某天正在用OPENGL写一个UI界面库,发现实现过程越来越很有趣,一发不可收拾。
于是想着能不能在逻辑型代码上实现类似界面的那种思维。
花了2天写的,对新手或者老手 都是会有帮助的。
这个类库的特点:
逻辑全部封装,你只需要提供要执行的行为,已经行为达到某个触发条件执行特定的事物。执行Execu即可。免去了大量重复的逻辑判断,大量的重复的函数调用。
加载大漠插件避开了COM组件注册表机制,用的WIN32方式加载
示例代码:
[COLOR="DarkOrchid"]
DmFindPic PicBaiDu_Open;//点击召唤师资料
DmFindPic PicBaiDu_Yixia;//查找是否有装备设置图标 但不点击
PicBaiDu_Open.SetPicName(".\\1.bmp");
PicBaiDu_Yixia.SetPicName(".\\2.bmp");
{
PicBaiDu_Yixia.Enable_Click_whileFind(false);//找到图片不点击
PicBaiDu_Yixia.Enable_break_whileFind();//找到了就退出app1
DmABCDEFG_ACTION Yidong;
Yidong.SetWay(偏移,100,20);
PicBaiDu_Yixia.AddSubDo(&Yidong);
DmABCDEFG_ACTION Shuangji;
Shuangji.SetWay(双击,NULL);
PicBaiDu_Yixia.AddSubDo(&Shuangji);
DmABCDEFG_ACTION Shuru;
Shuru.SetWay(输入文字,"测试");
Shuru.Enable_break_whileFind();
PicBaiDu_Yixia.AddSubDo(&Shuru);
}
Mydm dm1;
dm1.MianzhuCe();
dm1.RegDM();
DmManger app1;
app1.AttachDm(&dm1);
app1.SetDoAndDo_Time(10);
app1.SetSleepFunc(BindSleep(Mysleep));
app1.AddDo(&PicBaiDu_Open);
app1.AddDo(&PicBaiDu_Yixia);
while (app1.Execu()==false)
{
OutputDebugStringA("false");
}
AfxMessageBox("over");
// TODO: 在此添加控件通知处理程序代码
示例代码2:
void CMFCApplication1Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码.
DmFindPic PicBaiDu_Open;//点击召唤师资料
DmFindPic PicBaiDu_Yixia;//查找是否有装备设置图标 但不点击
DmFinStr findstr;
PicBaiDu_Open.SetPicName(".\\1.bmp");
PicBaiDu_Open.SetMove_ClickTime(1000);
PicBaiDu_Yixia.SetPicName(".\\2.bmp");
findstr.SetDicAndStr(0,"PLAY","f4dbb4-222222");
{
PicBaiDu_Yixia.Enable_Click_whileFind(false);//找到图片不点击
PicBaiDu_Yixia.Enable_break_whileFind();//找到了就返回
//找到了返回前执行自己的自定义函数
PicBaiDu_Yixia.SetFindCallBack(MyBinFindOrNoFindCallBack(ok90));
}
Mydm dm1;
dm1.MianzhuCe();
dm1.RegDM();
dm1.dm->SetDict(0,".\\dic.txt");
DmManger app1;
app1.AttachDm(&dm1);
app1.SetDoAndDo_Time(1000);
app1.SetSleepFunc(BindSleep(Mysleep));
app1.AddDo(&PicBaiDu_Open);
app1.AddDo(&findstr);
app1.AddDo(&PicBaiDu_Yixia);
//执行返回真的话 执行这段代码
app1.CreateWith_DmABCDEFG_ACTION(0,偏移,100,20,双击,单击,输入文字,"TEST");
while (app1.Execu()==false)
{
OutputDebugStringA("false");
}
AfxMessageBox("over");
}
代码的主要执行体为DmManger:
#include "stdafx.h"
#include "DmManger.h"
DmManger::DmManger(void)
{
dmCur =NULL;
node.clear();
NeedABCDEFG_WhileTrue =false;
//sleepFuc =NULL;
}
DmManger::~DmManger(void)
{
}
bool DmManger::AttachDm(Mydm* dm)
{
if (!dm)
{
Msg("传入对象为空,%s",FunStr(无效的对象地址));
return false;
}
dmCur =dm;
return true;
}
void DmManger::Msg(char* Str,...)
{
va_list args;
va_start(args,Str);
vsprintf(MsgBuf,Str,args);
va_end(args);
::MessageBoxA(0,MsgBuf,":",0);
}
bool DmManger::Execu()
{
for (auto i = node.begin() ;i!=node.end();i++)
{
(*i)->NodeDm=dmCur;
// sleepFuc(DoAndDoTime);
if (sleepFuc)
{
(*i)->funcSleep = sleepFuc;
}
(*i)->Do();
DoSleep();
if ((*i)->break_whileFind)
{
if ((*i)->IsFind)
{
LastX =(*i)->X;
LastY =(*i)->Y;
Do_ImCreateABCDEFG_While_True();
return true;
}
}
}
return false;
}
bool DmManger::Execu(int DoAndDoTime_)
{
for (auto i = node.begin() ;i!=node.end();i++)
{
(*i)->NodeDm=dmCur;
if (sleepFuc)
{
(*i)->funcSleep = sleepFuc;
}
(*i)->Do();
DoAndDoTime =DoAndDoTime_;
DoSleep();
if ((*i)->break_whileFind || (*i)->break_whileNoFind)
{
if ((*i)->IsFind)
{
LastX =(*i)->X;
LastY =(*i)->Y;
Do_ImCreateABCDEFG_While_True();
return true;
}
}
}
return false;
}
void DmManger::AddDo(DmNode* node_)
{
node.push_back(node_);
}
void DmManger::SetSleepFunc(SleepFunc fuc)
{
sleepFuc = fuc;
}
void DmManger::SetDoAndDo_Time(int time)
{
DoAndDoTime = time;
}
void DmManger::DoSleep()
{
if (sleepFuc)
{
sleepFuc(DoAndDoTime);
}
}
void DmManger::Reset()
{
node.clear();
}
void DmManger::MoveToLastXY(int OffX,int offY)
{
DoSleep();
dmCur->dm->MoveTo(LastX.lVal +OffX ,LastY.lVal+offY);
DoSleep();
dmCur->dm->LeftClick();
DoSleep();
}
void DmManger::CreateWith_DmABCDEFG_ACTION(int type_,...)
{
NeedABCDEFG_WhileTrue =true;
va_list va;
va_start(va,type_);
int typex=0;
typex=va_arg(va,int);
while (typex!=0)
{
if (typex==双击)
{
OutputDebugStringA("创建 双击动作");
std::shared_ptr<DmABCDEFG_ACTION> ptest( new DmABCDEFG_ACTION());
// DmABCDEFG_ACTION* pt->pt_=(new DmABCDEFG_ACTION());
ptest->SetWay(typex);
this->ADCDEFG_LIST.push_back( ptest);
}else if (typex==单击)
{
OutputDebugStringA("创建 单击");
// DmABCDEFG_ACTION* ptest= new DmABCDEFG_ACTION();
std::shared_ptr<DmABCDEFG_ACTION> ptest( new DmABCDEFG_ACTION());
ptest->SetWay(typex);
this->ADCDEFG_LIST.push_back( ptest);
}
else if (typex==偏移)
{
OutputDebugStringA("创建 偏移");
std::shared_ptr<DmABCDEFG_ACTION> ptest( new DmABCDEFG_ACTION());
int x= va_arg(va,int);
int y= va_arg(va,int);
ptest->SetWay(typex,x,y);
this->ADCDEFG_LIST.push_back( ptest);
}else if (typex==输入文字)
{
OutputDebugStringA("创建 输入文字");
std::shared_ptr<DmABCDEFG_ACTION> ptest( new DmABCDEFG_ACTION());
char* szstr= va_arg(va,char*);
ptest->SetWay(typex,szstr);
this->ADCDEFG_LIST.push_back( ptest);
}
typex=va_arg(va,int);
}
va_end(va);
}
void DmManger::Do_ImCreateABCDEFG_While_True()
{
if (ADCDEFG_LIST.empty()==true)
{
OutputDebugStringA("Do_ImCreateABCDEFG_While_True 字动作数组为空,直接返回");
// IsFind =true;
return;
}
for (auto i = ADCDEFG_LIST.begin() ;i!=ADCDEFG_LIST.end();i++)
{
std::shared_ptr<DmABCDEFG_ACTION> subnode =*i;
//把找到图片后XY传给子动作 以便做其他的事
subnode->MangerX =LastX;
subnode->MangerY =LastY;
subnode->NodeDm =this->dmCur;
subnode->DoABC();
if (subnode->break_whileFind)
{
if (subnode->IsFind)
{
OutputDebugStringA("find sub");
/*IsFind =true;*/
}
}
DoSleep();
}
}
不能运行请在Mydm.cpp里,Mydm::RegDM实现中,
把if ( dm->Reg("改成你的大漠注册码","")!=1)
DmABCDEFG_ACTION.cpp中
void DmABCDEFG_ACTION::Do()里面输入文字那一段使用了LOL的窗口句柄,自己可以修改一下框架,很简单,+LONG类型成员即可
代码需要C++11支持:vs2012以及更高的版本即可。
因为自己在开教程班,人很少,也希望有兴趣的朋友来学,没人学也希望能把技术共享在看雪。
----沫、D
整个工程的源代码:
DmClass.zip
[课程]Android-CTF解题方法汇总!