[外挂8] 自动挂机 SetTimer函数

时间:2023-03-09 03:01:28
[外挂8] 自动挂机 SetTimer函数

>_< : 这里用SetTimer函数自动运行![注意添加在里面的回掉函数函数]

 UINT SetTimer(
HWND hWnd, // 指向窗口句柄
UINT nIDEvent, // 时钟标识
UINT uElapse, // 时间间隔 (毫秒)
TIMERPROC lpTimerFunc // 指向回调函数的地址
); KillTimer(UINT nIDEvent); // 时钟标识 VOID CALLBACK playproc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
A();//SetTimer里的回掉函数
}
VOID CALLBACK strartproc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
B();
}

>_< : 在窗口上添加一个复选框CheckBox,设置为自动开局,再关联两个变量m_autoplay / m_autostart

[外挂8] 自动挂机 SetTimer函数

 //-----------------------------------------------------------------------------
void OnStartGame(int x,int y)
{
HWND gameh;//游戏窗口句柄
RECT r1;//RECT结构表示一个矩形区域
POINT p;//x,y gameh=::FindWindow(NULL,"井字棋");
::GetWindowRect(gameh,&r1); GetCursorPos(&p);//保存当前鼠标指针 //取得当前鼠标位置
SetCursorPos(x+r1.left,y+r1.top);//当前窗口坐标+开局按钮坐标 mouse_event(MOUSEEVENTF_LEFTUP,,,,);//鼠标在当前位置按下
mouse_event(MOUSEEVENTF_LEFTDOWN,,,,);//鼠标在当前位置抬起
mouse_event(MOUSEEVENTF_LEFTUP,,,,); Sleep();//过一段时间 再执行后边的代码
SetCursorPos(p.x,p.y); //还原鼠标位置
}
//---------------------------------------------------------------------------
int chessdata[][];//a[y][x]棋盘状态0-1-2
int win[][];//PC和外挂在8种情况下的棋子数
bool ptab[][]; //电脑的获胜的状态表
bool ctab[][]; //外挂的获胜的状态表 void init()
{
int count=,i,k;
//设定外挂与计算机在各个获胜组合中的棋子数
for(i=;i<;i++)
{
win[][i]=;
win[][i]=;
} //设定水平方向的获胜组合
for(i=;i<=;i+=)
{
for(k=;k<;k++)//3个棋子1个获胜组合
{
ptab[i+k][count]=true;
ctab[i+k][count]=true;
}
count++;
}
//设定垂直方向的获胜组合
for(k=;k<;k++)
{
for(i=;i<=;i+=)//3个棋子1个获胜组合
{
ptab[i+k][count]=true;
ctab[i+k][count]=true;
}
count++;
}
//设定对角线方向上的获胜组合
for(i=;i<=;i+=){
ptab[i][count]=true;
ctab[i][count]=true;
}count++;
for(i=;i<=;i+=){
ptab[i][count]=true;
ctab[i][count]=true;
}
}
void reup()//根据棋盘状态更新胜利表、外挂、电脑表
{
for(int i=;i<;i++){
for(int j=;j<;j++){
if(chessdata[i][j]==){
//改变胜利表和各外挂、PC各胜利组合的棋子数
for(int k=;k<;k++){
if(ptab[i*+j][k]){
win[][k]++;
ctab[i*+j][k]=false;
win[][k]=;
}
}
}else if(chessdata[i][j]==){
//改变胜利表和各外挂、PC各胜利组合的棋子数
for(int k=;k<;k++){
if(ptab[i*+j][k]){
win[][k]++;
ptab[i*+j][k]=false;
win[][k]=;
}
}
}
}
}
}
int getPos()//获取该下棋位置
{
int grades[][];
int m,i,max=;
int u; for(m=;m<;m++){
grades[][m]=;
grades[][m]=; if( chessdata[m/][m%]==){
for(i=;i<;i++){
//计算PC在空棋格上的获胜分数
if(ptab[m][i] && win[][i]!=){
switch(win[][i]){
case :
grades[][m]+=;
break;
case :
grades[][m]+=;
break;
case :
grades[][m]+=;
break;
}
} //计算外挂在空格上的获胜分数
if(ctab[m][i] && win[][i]!=){
switch(win[][i]){
case :
grades[][m]+=;
break;
case :
grades[][m]+=;
break;
case :
grades[][m]+=;
break;
}
}
} if(max==)u=m; if(grades[][m]>max){
max=grades[][m];
u=m;
}
else if(grades[][m]==max){
if(grades[][m]>grades[][u])u=m;
} if(grades[][m]>max){
max=grades[][m];
u=m;
}
else if(grades[][m]==max){
if(grades[][m]>grades[][u])u=m;
}
}
}
return u;
}
void play_zidong()
{
HWND gameh=::FindWindow(NULL,"井字棋");//获取窗口句柄
//获取窗口进程ID
DWORD processid;
::GetWindowThreadProcessId(gameh,&processid);
HANDLE processH=::OpenProcess(PROCESS_ALL_ACCESS,false,processid);//打开指定进程 //读指定进程 内存数据
DWORD byread;
LPCVOID pbase=(LPCVOID)0x014D507C; //棋盘数据基址
LPVOID nbuffer=(LPVOID)&chessdata; //存放棋盘数据
::ReadProcessMemory(processH,pbase,nbuffer,**,&byread);//进程句柄|基址|存放数据缓冲区|要读取数据的字节数|实际读取的字节数 //算法部分:自动走下一步
init();
reup();
int pos=getPos(); //鼠标点击
int x=+pos%*,y=+pos/*; //定义座标点
int lparam; //定义座标点变量
lparam=(y<<)+x; //表示指定格,Y<<16是左移16位,发消息用的Y座标点
::SendMessage(gameh,WM_LBUTTONDOWN,,lparam);//鼠标按下消息
::SendMessage(gameh,WM_LBUTTONUP,,lparam); //鼠标抬起消息
}
void CFewDlg::OnButton5()
{
play_zidong();
}
//-------------------------------------------------------------------------------------
VOID CALLBACK CFewDlg::playproc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
play_zidong();
}
VOID CALLBACK CFewDlg::strartproc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
)
{
OnStartGame(,);//自动开局
} const PLAYID=;//定义一个数值方便调用,不要重复
const STARTID=;//可以随便取数,不要重复
void CFewDlg::OnCheck1()
{
UpdateData(true);//更新窗口内容至变量
if (m_autoplay){//如果变量被设置则运行
SetTimer(PLAYID,,&playproc);//自动挂机
}else{
KillTimer(PLAYID);//关掉定时器,不执行回调函数
}
}
void CFewDlg::OnCheck2()
{
UpdateData(true);//更新窗口内容至变量
if (m_autoplay){//如果变量被设置则运行
SetTimer(STARTID,*,&strartproc);//自动开局
}else{//如果没有被选中的话
KillTimer(STARTID);
}
}