开源C++配合大漠插件实现的消息泵模式按键模拟编程开发背景:某天正在用OPENGL写一个UI界面库,发现实现过程越来越很有趣,一发不可收拾。
于是想着能不能在逻辑型代码上实现类似界面的那种思维。
花了2天写的,对新手或者老手都是会有帮助的。
这个类库的特点:逻辑全部封装,你只需要提供要执行的行为,已经行为达到某个触发条件执行特定的事物。
执行Execu即可。
免去了大量重复的逻辑判断,大量的重复的函数调用。
加载大漠插件避开了COM组件注册表机制,用的WIN32方式加载示例代码:代码: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();//找到了就退出app1DmABCDEFG_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_A CTION());ptest->SetWay(typex);this->ADCDEFG_LIST.push_back( ptest);}else if (typex==偏移){OutputDebugStringA("创建偏移");std::shared_ptr<DmABCDEFG_ACTION> ptest( new DmABCDEFG_A CTION());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_A CTION());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以及更高的版本即可。