>_< : 这里用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函数的更多相关文章

  1. SetTimer函数的用法

    什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数 了.使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...

  2. 有关SetTimer函数的用法

    1 )用WM_TIMER来设置定时器 先请看SetTimer这个API函数的原型 UINT_PTR SetTimer( HWND hWnd, // 窗口句柄 UINT_PTR nIDEvent, // ...

  3. 基于MFC的Media Player播放器制作的SetTimer函数介绍

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. SetTimer是一种API函数,位于user32.dll中.你想每隔一段时间执行一件事的的时候,你可以使用它. 使用定时器的方法比 较简 ...

  4. ajax的使用:(ajaxReturn[ajax的返回方法]),(eval返回字符串);分页;第三方类(page.class.php)如何载入;自动加载函数库(functions);session如何防止跳过登录访问(构造函数说明)

    一.ajax例子:ajaxReturn("ok","eval")->thinkphp中ajax的返回值的方法,返回参数为ok,返回类型为eval(字符串) ...

  5. Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 6 ...

  6. PHP 命名空间以及自动加载(自动调用的函数,来include文件)

    这篇文章的目的是记录 1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数, 2 .php中命名空间的使用. 一.当不使用命名空间的时候 a ...

  7. php的自动加载函数spl_autoload_register和__autoload

    spl_autoload_register和__autoload是用来自动加载类的,不用每次都require,include这样搞. 先说__autoload的用法, 在同级目录建立2个文件,一个in ...

  8. php自动加载函数

    含义:将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们. 先看__autoload 函数 printit.class.php <?php class PRI ...

  9. Effective C++ -----条款06:若不想使用编译器自动生成的函数,就该明确拒绝

    为驳回编译器自动提供的功能,可将相应的成员函数声明为private并且不予实现. 使用像Uncopyable这样的base class也是一种做法(即先声明一个基类,然后私有继承它).这其实有点像使用 ...

随机推荐

  1. information_schema系列三(文件,变量)

    这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:FILES 这张表提供了有关在MySQL的表空间中的数据存储的文 ...

  2. 一个用php实现的获取URL信息的类

    获取URL信息的类 使用这个类,你能获得URL的如下信息: - Host  - Path  - Statuscode (eg. 404,200, ...)  - HTTP Version  - Ser ...

  3. c#中获取数组的行列个数的方法

    GetUpperBound可以获取数组的最高下标.GetLowerBound可以获取数组的最低下标.这样就可以实现对数组的遍历//定义二维数组string[,] myStrArr2=new strin ...

  4. asp.net GDI+绘制多个矩形

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  5. 安装mysql5.5时候的报错解决办法:

    每次安装mysql5.5的时候总会报出一下错误: -- Could NOT find OpenSSL (missing: OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) ...

  6. Echarts tooltip文字没有左对齐

    tooltip : { trigger: 'axis', axisPointer : { // 坐标轴指示器,坐标轴触发有效 type : 'shadow' // 默认为直线,可选为:'line' | ...

  7. Codeforces Round #325 垫底纪念

    A. Alena's Schedule 间隔0长度为1被记录  1被记录  其余不记录 #include <iostream> #include <cstring> #incl ...

  8. HDOJ 4508 湫湫系列故事——减肥记I (完全背包带优化)

    完全背包的模版题.. 加了一个小优化  n^2的写法 O(V+N)在本题中复杂度较高 不采纳 完全背包问题有一个很简单有效的优化,是这样的:若两件物品i.j满足c[i]<=c[j]且w[i]&g ...

  9. win32api 获取文件版本信息

    #coding:utf-8 myPath="C:\\ime" import os from win32api import GetFileVersionInfo, LOWORD, ...

  10. strace命令介绍(转)

    原文链接:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信 ...