开源 C++配合大漠插件实现的消息泵模式按键模拟编程
大漠 python调用

大漠 python调用
大漠是一个开源的Python库,可以用于调用各种功能和服务。
它提供了丰富的接口和功能,可以帮助开发者更方便地进行编程和开发工作。
使用大漠库进行Python调用非常简单。
首先,我们需要安装大漠库并导入它。
然后,我们可以使用库中提供的各种函数和方法来实现我们想要的功能。
例如,如果我们想要编写一个程序自动化鼠标点击的功能,可以使用大漠库中的鼠标点击函数来实现。
我们只需要调用相应的函数,并传入需要点击的坐标即可。
除了鼠标点击,大漠库还提供了许多其他功能,如键盘输入、窗口操作、图像识别等。
使用这些功能,我们可以编写出各种自动化程序,提高工作效率。
不仅如此,大漠库还可以调用一些外部服务,如OCR文字识别、语音合成等。
这些功能可以帮助开发者更轻松地处理一些复杂的任务。
大漠库是一个强大而方便的Python库,可以帮助开发者更高效地进行编程和开发工作。
无论是自动化任务还是外部服务调用,使用大漠库都可以帮助我们实现更多的功能。
让我们一起来探索和利用大漠库,为我们的编程工作增添便利和乐趣吧!。
开源 C++配合大漠插件实现的消息泵模式按键模拟编程

开源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以及更高的版本即可。
openmodelica调用c代码

主题:openmodelica调用c代码1. 介绍OpenModelicaOpenModelica是一种用于系统级建模和仿真的开源工具。
它允许用户使用建模语言对系统进行建模,并进行仿真和分析。
这使得OpenModelica成为工程师和科学家在设计和测试各种系统时的理想选择。
2. c代码在系统建模中的重要性C语言是一种被广泛应用的编程语言,它可以用于开发各种软件和系统。
在系统建模领域,C代码可以用于描述系统的特定行为和功能。
将C代码整合到OpenModelica中可以为用户提供更丰富的建模能力。
3. OpenModelica调用C代码的优势通过OpenModelica调用C代码,用户可以利用C代码的强大功能,如高效性能和低级的系统控制。
这使得OpenModelica能够满足更广泛的建模需求,并为用户提供更灵活和多样化的建模选择。
4. OpenModelica调用C代码的实现方法在OpenModelica中,用户可以通过外部函数接口(External Function Interface)来调用C代码。
用户可以使用OpenModelica的建模工具来创建一个接口函数,该函数将调用C代码并将其嵌入到建模中。
这个过程需要用户具备一定的C语言编程能力,但经过简单的学习后,就能够轻松掌握。
5. 调用C代码的示例假设用户想要在OpenModelica中建模一个电机系统,并使用C代码描述电机的控制算法。
用户可以首先编写C代码来描述电机的控制算法,然后利用OpenModelica的外部函数接口来调用这段C代码。
通过这种方式,用户可以在OpenModelica中实现对电机系统的复杂建模和仿真。
6. 调用C代码的注意事项在使用OpenModelica调用C代码时,用户需要注意一些细节。
确保C代码在编译时没有错误,并且符合OpenModelica的接口要求。
需要理解C代码与OpenModelica建模的协同工作方式,以确保两者能够正确地互相调用。
开源软件模拟键盘操作方法

开源软件模拟键盘操作方法
1. 使用Python模拟键盘操作:使用Python中的pyautogui库可以模拟键盘按键。
例如,要模拟按下“Ctrl+C”组合键,可以使用以下代码:
import pyautogui
pyautogui.keyDown('ctrl')
pyautogui.press('c')
pyautogui.keyUp('ctrl')
2. 使用AutoHotkey模拟键盘操作:AutoHotkey是一个免费开源脚本语言,专门用于自动化任务,包括模拟键盘和鼠标操作。
以下是一个使用AutoHotkey 模拟按下“Ctrl+C”组合键的脚本:
^c::
Send, {ctrl down}c{ctrl up}
Return
3. 使用Java Robot类模拟键盘操作:Java中的Robot类可以让程序模拟键盘和鼠标操作。
以下是一个使用Java Robot类模拟按下“Ctrl+C”组合键的代码:
import java.awt.Robot;
import java.awt.event.KeyEvent;
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_C);
robot.keyRelease(KeyEvent.VK_CONTROL);
无论使用哪种方法,都需要先了解键盘上的按键代码和操作方法。
开源社区中有大量的键盘模拟库和文档可用来参考。
大漠插件字库原理介绍.

首先说明下大漠综合工具制作字库的过程和原理1.截取你所需要的图片2.点击你所需要字的颜色3.点击提取点阵4.输入字符按回车生成字库具体的原理我不好说,但是就我的理解是:对图片中不符合指定颜色的部分去除掉,然后二值化获取点阵,点阵也就是这些颜色的分布规律,二值化就是黑白两色,RGB格式中黑色"000000"白色"ffffff"由于我的脚本在别人电脑上运行的时候经常失效,今天改成16位色后我机器上运行也失效了,而我这个脚本主要采用的就是大漠插件的找字功能,我以为是机器间的色偏造成的,一直想法子算色偏,但是我失败了。
后来我想起论坛上有个帖子专门讲过同色系的RGB格式中R值是不变的(不好意思忘了作者了,在这里致谢)于是我就在大漠综合工具的色偏处输入了00ffff结果是在16位色环境下,大漠综合工具中二值化区域内的字显示的跟我在32位色环境下做的一模一样,接着我提取点阵,制作字库,进行调试,命令格式如下:dm_ret =dm.FindStr(0,0,978,585, "码", "ffd463-00ffff", 1.0, x1, y1)If x1 >= 0 ThenMessageBox x1 & y1End If准确的弹出了x,y的坐标值接着我换32位色做同样的调试,显示结果与16位色下相同,我测了坐标正好是我要找的字的左上角经多次测试发现这个方法中字色的R值必须为FF或00(至于F1,01等未测试,有兴趣的朋友可以试试)庆幸啊以后找字可以不考虑偏色了呵呵再说了考虑我也不会算具体原理我也不是很懂,但是我估计应该是:我比较了点阵中R值相同的所有点,取得符合二值化点阵区域内所有的点造成的再次提醒此方法只适合R值为00,FF的其他位置相同的未测试当然这么做效率是低了点,但是在我看来脚本应该是:稳定性>通用性>执行效率,毕竟脚本也是你编写的一种软件吗鲜花,银币在哪拿来啊呵呵简单说下后台操作的方法,先判断该窗口是否支持后台,用下面的语句:Hwnd=Plugin.Window.Foreground()Hwmd=Plugin.Window.GetkeyFocusWnd()If Hwmd<>0 thenMessagebox "可以"ElseMessagebox "不可以"End if然后把下面的放在脚本开头Hwnd=Plugin.Window.Foreground()Hwnd=Plugin.Window.GetkeyFocusWnd()//下面接自己的代码首先后台一点是要有句柄、这个很简单第一步我们先打开抓抓,接着点击句柄接着把鼠标移到你所要后台的窗口上,按下F8 是否看见当前窗口句柄那里出现一串数字?把它复制下来第二步我们点击图像,在指定窗口句柄那里打钩接着把数字复制进去按下抓图键(Print Screen SysRq) 是否只看见你要后台的的图像呢?对着你所需要的坐标按右键加入点1 记住坐标然后加入到后台鼠标点击里面就行了第三步我们在后台命令中找到鼠标指向窗口点击插入命令是Hwnd = Plugin.Window.MousePoint()第四步我们要进行后台鼠标点击或者后台输入键盘命令是Call Plugin.Bkgnd.LeftClick(Hwnd, 0, 0)在按键看了很多教程关于"多开..."的我看了后回味,似乎都是单线程的,往往新手会问,难道不能让精灵同事做2件事情吗?新手问的其实是问:按键可以多线程后台吗?由此我突然奇想且试验成功.且次试验可将任何的单开后台变为多开后台脚本.如有愚昧的地方指指教了. 作业:设计一个在记事本上后台打字"1"的循环代码要求:能循环多开Hwnd = Plugin.Window.MousePoint()rem aCall Plugin.Bkgnd.KeyPress(Hwnd, 49)Delay 500goto a注:8.0写的如只有7的同学自己翻译不太难的回复后能见教程本帖隐藏的内容需要回复才可以浏览第一步:将禁止脚本重复运行选为否(在是否循环的下面)第二步:设置启动热键为F2(以免与记事本热键冲突)第三步:保存退出(或选调试)第四步:打开第一个记事本文件,鼠标指中按F2,此时可看见后台打的111出现最小化第五步:打开第二个记事本文件,鼠标指中按F2,此时可看见后台打的111出现最小化........此时你如果将多个记事本都打开看他们都在干活呢-------可以无限后台多开-多线程的哦总结:第一步很关键.启示:如果我做的"打1"的脚本换成打怪的呢?本帖隐藏的内容需要回复才可以浏览第1步:什么是后台插件及命令首先我们要明白什么是后台插件以及后台命令,在编辑窗口找到全部命令,找到窗口插件(建议大家可以站内搜一下361插件,下载后放进去,看一下361插件的命令),点开后点击每一条命令仔细看说明,对比每条命令跟前台命令的对应关系,这样我们就可以把对应的前台命令转换为后台命令了。
按键插件应用说明

按键插件应用篇注意:本篇做为按键使用大漠插件的插件篇,本篇会按会员要求有所增补,故顺序会有所改变,请大家按实际顺序观看!第一节、教你做一个最简单的打怪挂在我们做游戏的辅助工具的时候,一般是将游戏窗口化,这样是为了将来游戏多开或者是后台打游戏,前台可以看电影等等做准备的。
1、先查找游戏快捷键一般的游戏都有快捷键,这个我们要仔细的查找。
2、使用按键精灵来XXX一个简单的前台挂通过这个简单的挂我们可以看出A、怪物的级别不同,被打死的时间也不一样,所以我们要判断打死一个怪的时间B、人物的血量消耗到一定比例时加血的问题C、珍兽加血的问题D、加血药吃光后买药问题,等等这些我会在以后的教程中一一的给大家讲授好,现在开始第二节第二节、大漠工具、插件的使用。
1、大漠插件与工具熟悉按键的朋友都知道,大漠的插件是免费的,并且是免费插件中几乎最好用的插件这个是下载XXX:下载注册方法:打包dm.dll到附件添加以下代码在脚本最开始//这句意思是解包文件到文件夹PutAttachment "c:\test_game","*.*"//这句意思是创创建并返回对像set ws=createobject("Wscript.Shell")//这句意思是注册大漠插件ws.run "regsvr32 c:\test_game\dm.dll /s"set ws=nothingDelay 1500我们可以在D盘做一个游戏的文件夹来使用。
在D盘做一个TianLong的文件夹吧,大家来看我的演示。
第三节、文字识别的方法。
好,大家都注册完了吧,现在开始讲一下文字的识别方法1、我们先在上边所说过的文件夹中建立一个记事本吧,名还是为TianLong.txt,然后打开大漠工具,打开或新建字库。
2、我们就找这个字吧,“路”,请仔细看我的操作好,文字识别大家都会了吧,我在下一节给大家讲一下游戏的后台判断。
大漠插件开发手册

大漠插件开发手册大漠插件是一款用于自动化操作和控制Windows系统的软件开发工具,它可以模拟鼠标、键盘等操作,并提供了丰富的API接口,方便开发者进行各种自动化任务的开发。
本手册主要介绍大漠插件的基本用法和相关API接口的调用方法,帮助开发者快速上手和开发自己的自动化任务。
1. 安装和配置大漠插件- 下载大漠插件的安装包,并进行安装。
- 配置开发环境,将大漠插件的安装目录添加到系统路径中。
2. 创建一个插件对象在代码中引入大漠插件的命名空间,并创建一个插件对象。
```using System;using System.IO;using System.Runtime.InteropServices;namespace DM.PluginDemo{class Program{static void Main(string[] args){DmPlugin.Plugin dm = new DmPlugin.Plugin();}}}```3. 配置大漠插件的基本参数在创建插件对象后,需要对插件进行一些基本参数的配置,比如设置插件所使用的窗口句柄、设置插件的工作路径等。
```DmPlugin.Plugin dm = new DmPlugin.Plugin();dm.SetPath(Path.GetDirectoryName(System.Reflection.Assembly. GetExecutingAssembly().Location));dm.SetDict(0, "dm_soft.txt");```4. 使用鼠标相关的API接口大漠插件提供了一系列鼠标相关的API接口,比如模拟鼠标左键点击、模拟鼠标移动等。
```dm.MoveTo(100, 100);dm.LeftClick();```5. 使用键盘相关的API接口大漠插件也提供了一系列键盘相关的API接口,比如模拟键盘按键、模拟键盘输入等。
学习怎么制作游戏辅助,按键后台插件命令为什么会失效?

学习怎么制作游戏辅助,按键后台插件命令为什么会失效?来源:按键学院【按键精灵】按键后台命令就是无效!抓狂啊,暴躁啊,忍不住泪牛满面啊~是否有同学遇到这样的情况呢?有吧?肯定有。
是什么原因呢?原因一、游戏窗口句柄没有获取到1. 游戏加壳,无法获取窗口句柄。
你要绑定的游戏它加了壳,所以无法获取窗口句柄,无法绑定窗口。
无法向窗口发送后台命令。
(加壳的全称是可执行程序资源压缩,是保护文件的常用手段.它起到了加密隐藏的保护作用。
让你无法抓到窗口句柄。
)这种情况比较复杂,有很多脱壳的工具,但是并不是你试用了一款脱壳软件它就一定适用于你要绑定的游戏,你可能要尝试很多种。
2. 游戏hook了GetParent函数接口hook技术可以将自身的代码“融入”被hook住的程序的进程中,成为目标进程的一个部分。
通过hook“接触”到需要修改的api函数入口点,改变它的地址指向新的自定义的函数。
GetParent函数是用于获得一个指定子窗口的父窗口句柄,如果游戏对它进行了hook,我们就无法获取想要获取的游戏窗口句柄。
3. 电脑上运行了其他的挂机软件电脑上运行了其他的挂机软件,导致了要操作的游戏窗口受到了干扰冲突。
关掉其他的挂机软件,重启游戏再绑定。
导致了要操作的游戏窗口受到了干扰冲突。
关掉其他的挂机软件,重启游戏再绑定。
原因二、游戏采用的绘图方式差异(图色信息获取与识别方向)目前较为热门的几种绘图分别是:GDI、OpenGL 、DirectX。
它们的功能就是处理图形图像(我们把范围缩小一点,就拿游戏窗口的图色做例子),GDI 是通过操作系统支配最后达成游戏窗口图色的显示,而OpenGL 、DirectX 它们两个是由显卡操作达成游戏窗口图色显示的。
按键精灵无法对基于显卡的OpenGL 、DirectX直接操作:我们的按键后台命令是基于操作系统的,所以无法直接对基于显卡的OpenGL 、DirectX 进行操作。
无法对它操作就意味着无法获取图色信息,在使用后台图色命令的时候就会失效。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开源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以及更高的版本即可。