[外挂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

//-----------------------------------------------------------------------------
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);
}
}
[外挂8] 自动挂机 SetTimer函数的更多相关文章
- SetTimer函数的用法
什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数 了.使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...
- 有关SetTimer函数的用法
1 )用WM_TIMER来设置定时器 先请看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // ...
- 基于MFC的Media Player播放器制作的SetTimer函数介绍
| 版权声明:本文为博主原创文章,未经博主允许不得转载. SetTimer是一种API函数,位于user32.dll中.你想每隔一段时间执行一件事的的时候,你可以使用它. 使用定时器的方法比 较简 ...
- ajax的使用:(ajaxReturn[ajax的返回方法]),(eval返回字符串);分页;第三方类(page.class.php)如何载入;自动加载函数库(functions);session如何防止跳过登录访问(构造函数说明)
一.ajax例子:ajaxReturn("ok","eval")->thinkphp中ajax的返回值的方法,返回参数为ok,返回类型为eval(字符串) ...
- Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝
Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...
- PHP 命名空间以及自动加载(自动调用的函数,来include文件)
这篇文章的目的是记录 1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数, 2 .php中命名空间的使用. 一.当不使用命名空间的时候 a ...
- php的自动加载函数spl_autoload_register和__autoload
spl_autoload_register和__autoload是用来自动加载类的,不用每次都require,include这样搞. 先说__autoload的用法, 在同级目录建立2个文件,一个in ...
- php自动加载函数
含义:将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 先看__autoload 函数 printit.class.php <?php class PRI ...
- Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝
为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...
随机推荐
- LoadRunner ---手动关联与预关联
手动关联 如果脚本很长,那么我们想找到一个脚本中哪些地方是需要关联的并不是一件容易的事情.这时,我们可以通过脚本对比的方法找 ...
- 平行四边形TikZ作图
%!TEX program = pdflatex \documentclass[varwidth=true, border=2pt]{standalone} \usepackage{tikz} \us ...
- Gradle basic
1. execute default file (build.gradle) gradlew 2. execute another file gradlew -b [filename] 3. bas ...
- [2015hdu多校联赛补题]hdu5303 Delicious Apples
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5303 题意:在一个长为L的环形路径上种着一些苹果树,告诉你苹果树的位置(题目中以0~L指示坐标)及苹果 ...
- 《机器学习实战》学习笔记——第14章 利用SVD简化数据
一. SVD 1. 基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2)优点:简化数据, 去除噪声,提高算法的结果 (3)缺点: ...
- 笔记本Linux推荐
1.CUB LINUX Cub Linux 是一个最好的选择.他的前身来自著名的 Chromium OS , Cub Linux 能够运行在各种各样的笔记本上面.即便是早年的老机,亦或是现在的新机.从 ...
- JavaScript小功能
1. JS判断是否为一个有效日期 1 2 3 4 function check(date){ return (new Date(date).getDate()==date.substring( ...
- python-->基础-->003->字符串处理
一.去除字符串首尾白空格 说明:即为去除字符串的首尾(即头部和尾部)的白空格(空格本身,回车\r,换行\n,制表符\t, 换页符\f ) 实例: str01 = ' abc def # ' print ...
- Log4j基本用法
基本使用方法: Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式.日志信息的优先级从高到低有ERROR.WARN.INFO.DEBUG,分别用来指定这条日志信 ...
- iOS.StaticLibrary.1-avoid-duplicate-symbol-in-static-library[draft]
Avoid duplicate symbol in static library and its customer 发布static library给使用者使用.在实际的工程实践中,iOS静态库一般会 ...