HanDs
管理员

[Delphi文章] 鼠标和键盘模拟技术 





学习中请遵循国家相关法律法规,黑客不作恶。没有网络安全就没有国家安全

本站需要登陆后才能查看

1. 鼠标模拟技术
  
  几乎所有的游戏中都使用了鼠标来改变角色的位置和方向,玩家仅用一个小小的鼠
标,就可以使角色畅游天下。

那么,我们如何实现在没有玩家的参与下角色也可以自动行走呢。其实实现这个并不
难,仅仅几个Windows API函数就

可以搞定,让我们先来认识认识这些API函数。

  (1) 模拟鼠标动作API函数mouse_event,它可以实现模拟鼠标按下和放开等动作。

    VOID mouse_event(
      DWORD dwFlags, // 鼠标动作标识。
      DWORD dx, // 鼠标水平方向位置。
      DWORD dy, // 鼠标垂直方向位置。
      DWORD dwData, // 鼠标轮子转动的数量。
      DWORD dwExtraInfo // 一个关联鼠标动作辅加信息。
    );

  其中,dwFlags表示了各种各样的鼠标动作和点击活动,它的常用取值如下:

   MOUSEEVENTF_MOVE 表示模拟鼠标移动事件。

   MOUSEEVENTF_LEFTDOWN 表示模拟按下鼠标左键。

   MOUSEEVENTF_LEFTUP 表示模拟放开鼠标左键。

   MOUSEEVENTF_RIGHTDOWN 表示模拟按下鼠标右键。

   MOUSEEVENTF_RIGHTUP 表示模拟放开鼠标右键。

   MOUSEEVENTF_MIDDLEDOWN 表示模拟按下鼠标中键。

   MOUSEEVENTF_MIDDLEUP 表示模拟放开鼠标中键。

  (2)、设置和获取当前鼠标位置的API函数。获取当前鼠标位置使用GetCursorPos()
函数,设置当前鼠标位置使用

SetCursorPos()函数。

    BOOL GetCursorPos(
     LPPOINT lpPoint // 返回鼠标的当前位置。
    );
    BOOL SetCursorPos(
    int X, // 鼠标的水平方向位置。
      int Y //鼠标的垂直方向位置。
    );

  通常游戏角色的行走都是通过鼠标移动至目的地,然后按一下鼠标的按钮就搞定
了。下面我们使用上面介绍的API

函数来模拟角色行走过程。

   CPoint oldPoint,newPoint;
   GetCursorPos(&oldPoint); //保存当前鼠标位置。
   newPoint.x = oldPoint.x+40;
   newPoint.y = oldPoint.y+10;
   SetCursorPos(newPoint.x,newPoint.y); //设置目的地位置。
   mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模拟按下鼠标右键。
   mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模拟放开鼠标右键。

  2. 键盘模拟技术

  在很多游戏中,不仅提供了鼠标的操作,而且还提供了键盘的操作,在对攻击对象
进行攻击时还可以使用快捷键

。为了使这些攻击过程能够自动进行,外挂程序需要使用键盘模拟技术。像鼠标模拟技
术一样,Windows API也提供了

一系列API函数来完成对键盘动作的模拟。

  模拟键盘动作API函数keydb_event,它可以模拟对键盘上的某个或某些键进行按下
或放开的动作。

   VOID keybd_event(
     BYTE bVk, // 虚拟键值。
     BYTE bScan, // 硬件扫描码。
     DWORD dwFlags, // 动作标识。
     DWORD dwExtraInfo // 与键盘动作关联的辅加信息。
   );

  其中,bVk表示虚拟键值,其实它是一个BYTE类型值的宏,其取值范围为1-254。有
关虚拟键值表请在MSDN上使用

关键字“Virtual-Key Codes”查找相关资料。bScan表示当键盘上某键被按下和放开
时,键盘系统硬件产生的扫描码

,我们可以MapVirtualKey()函数在虚拟键值与扫描码之间进行转换。dwFlags表示各种
各样的键盘动作,它有两种取 

值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。

  下面我们使用一段代码实现在游戏中按下Shift+R快捷键对攻击对象进行攻击。

   keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL
键。
   keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//键下R键。
   keybd_event(0x52,MapVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);//放开R键。
   keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),
   KEYEVENTF_KEYUP,0);//放开CTRL键。


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
鼠标 键盘 模拟 技术
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:2
waz5659639
圣百合LV21


学习中请遵循国家相关法律法规,黑客不作恶。没有网络安全就没有国家安全

本站需要登陆后才能查看

学习,谢谢分享。

2016-7-21 #2楼
北风之神
天堂鸟LV23


学习中请遵循国家相关法律法规,黑客不作恶。没有网络安全就没有国家安全

本站需要登陆后才能查看

学习,谢谢分享

2016-7-21 #3楼
游客组
快速回复