[外挂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也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...
随机推荐
- Repeater控件 ---属性(ItemCommand事件)
epeater的Command操作:1.ItemCommand事件 - 在Repeater中所有能触发事件的控件,都会来触发这一个事件 2.CommandName - 判断点击的是什么按钮,e.Com ...
- python 排序
python 写的排序,实现起来还是比较简单 #快速排序 def qsort(L): if len(L)>1: return qsort([i for i in L[1:] if i<L[ ...
- ORACLE fetch bulk collect into limit
DECLARE TYPE rr IS REF CURSOR; TYPE r_emp IS RECORD( empno ), ename ), job ), mgr ), hiredate DATE, ...
- [2015hdu多校联赛补题]hdu5348 MZL's endless loop
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给你一个无向图,要你将无向图的边变成有向边,使得得到的图,出度和入度差的绝对值小于等于1, ...
- Swift3.0基础语法学习<五>
异常处理: // // ViewController5.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/16. // Copyright © ...
- .Net中几种常见的页面跳转传值方法
1.ASP Server对象Execute方法 ASP Server对象的Execute方法可以在执行当前页面的过程中将另一个页面执行结果的内容插入到当前页面的输出中.Execute方法带一个参数,是 ...
- frame和bounds的区别与联系
首先先看一下下面两个属性的代码实现: -(CGRect)frame{ return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.fr ...
- C#动态执行字符串(动态创建代码)
在编写C#程序的时候,有时我们需要动态生成一些代码并执行.然而C#不像JavaScript有一个Eval函数,可以动态的执行代码.所有这些功能都要我们自己去完成.如下是实例. 动态创建代码: usin ...
- iOS.StaticLibrary.1-avoid-duplicate-symbol-in-static-library[draft]
Avoid duplicate symbol in static library and its customer 发布static library给使用者使用.在实际的工程实践中,iOS静态库一般会 ...
- 关于卡尔曼滤波(Kalman Filter)的很好讲解
http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies C#代码: double[] Data = new double[] { 0.39 ...