首页
社区
课程
招聘
[原创]开源 C++配合大漠插件实现的消息泵模式按键模拟编程
发表于: 2015-4-14 00:51 14162

[原创]开源 C++配合大漠插件实现的消息泵模式按键模拟编程

2015-4-14 00:51
14162
开发背景:某天正在用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解题方法汇总!

上传的附件:
收藏
免费 4
支持
分享
最新回复 (9)
雪    币: 201
活跃值: (458)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主无私的精神,前排支持……
2015-4-14 08:35
0
雪    币: 135
活跃值: (63)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
学习mark。
2015-4-14 09:01
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主,您这个dm是那个版本啊,配套的chm能给一份嘛,先谢谢啦
2015-4-14 09:36
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
赞一个,支持开源。
2015-4-14 09:37
0
雪    币: 261
活跃值: (537)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
大漠哪个版本都可以,免费版的也可以的
2015-4-14 13:28
0
雪    币: 5
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个能在登陆框那里模式输入账号密码吗?
2015-4-30 01:10
0
雪    币: 5
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
LZ 我QQ51007712,我有问题请教,希望加Q详谈。
2015-5-4 11:34
0
雪    币: 5
活跃值: (108)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
研究了下这个代码,测试平台VS2012  WINDOWS8.1 测试时间:2015-05-07 测试没用。

但是看这个代码好像是一个教程里的,不知道可以说说是什么教程呢?
2015-5-7 11:03
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不能运行请在Mydm.cpp里,Mydm::RegDM实现中,
把if ( dm->Reg("改成你的大漠注册码","")!=1)
2016-3-4 13:21
0
游客
登录 | 注册 方可回帖
返回
//