sun牧马人键盘鼠标怎么样样

药品服务许可证(京)-经营-违法不良信息举报: 电话、邮箱youkujubao@service.alibaba.com请使用者仔细阅读优酷、、、、和Copyright(C)2018 优酷 youku.com 版权所有博客访问: 650807
博文数量: 145
博客积分: 10012
博客等级: 上将
技术积分: 1365
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++ 16:39:08
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,newP   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和
EYEVENTF_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键。
3. 激活外挂
  上面介绍的鼠标和键盘模拟技术实现了对游戏角色的动作部分的模拟,但要想外挂能工作于游戏之上,还需要将其与游戏的场景窗口联系起来或
者使用一个激活键,就象按键精灵的那个激活键一样。我们可以用GetWindow函数来枚举窗口,也可以用Findwindow函数来查找特定的窗口。另
外还有一个FindWindowEx函数可以找到窗口的子窗口,当游戏切换场景的时候我们可以用FindWindowEx来确定一些当前窗口的特征,从而
判断是否还在这个场景,方法很多了,比如可以GetWindowInfo来确定一些东西,比如当查找不到某个按钮的时候就说明游戏场景已经切换了等等办
法。当使用激活键进行关联,需要使用Hook技术开发一个全局键盘钩子,在这里就不具体介绍全局钩子的开发过程了,在后面的实例中我们将会使用到全局钩
子,到时将学习到全局钩子的相关知识。
4. 实例实现
  通过上面的学习,我们已经基本具备了编写动作式游戏外挂的能力了。下面我们将创建一个画笔程序外挂,它实现自动移动画笔字光标的位置并
写下一个红色的“R”字。以这个实例为基础,加入相应的游戏动作规则,就可以实现一个完整的游戏外挂。这里作者不想使用某个游戏作为例子来开发外挂(因没
有游戏商家的授权啊!),如读者感兴趣的话可以找一个游戏试试,最好仅做测试技术用。
  首先,我们需要编写一个全局钩子,使用它来激活外挂,激活键为F10。创建全局钩子步骤如下:
  (1).选择MFC AppWizard(DLL)创建项目ActiveKey,并选择MFC Extension DLL(共享MFC拷贝)类型。
  (2).插入新文件ActiveKey.h,在其中输入如下代码:
   #ifndef _KEYDLL_H   #define _KEYDLL_H
   class AFX_EXT_CLASS CKeyHook:public CObject   {    public: CKeyHook(); ~CKeyHook(); HHOOK Start(); //安装钩子 BOOL Stop(); //卸载钩子   };   #endif
  (3).在ActiveKey.cpp文件中加入声明"#include ActiveKey.h"。
  (4).在ActiveKey.cpp文件中加入共享数据段,代码如下:
   //Shared data section   #pragma data_seg("sharedata")   HHOOK glhHook=NULL; //钩子句柄。   HINSTANCE glhInstance=NULL; //DLL实例句柄。   #pragma data_seg()
  (5).在ActiveKey.def文件中设置共享数据段属性,代码如下:
   SETCTIONS   shareddata READ WRITE SHARED
  (6).在ActiveKey.cpp文件中加入CkeyHook类的实现代码和钩子函数代码:
   //键盘钩子处理函数。   extern "C" LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAMlParam)   {   if( nCode >= 0 )   {   if( wParam == 0X79 )//当按下F10键时,激活外挂。 {  //外挂实现代码。CPoint newPoint,oldP   GetCursorPos(&oldPoint);   newPoint.x = oldPoint.x+40;   newPoint.y = oldPoint.y+10;   SetCursorPos(newPoint.x,newPoint.y);   mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模拟按下鼠标左键。  mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模拟放开鼠标左键。  keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0); //按下SHIFT键。  keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//按下R键。  keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);//放开R键。  keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);//放开SHIFT键。      SetCursorPos(oldPoint.x,oldPoint.y); }   }   return CallNextHookEx(glhHook,nCode,wParam,lParam);   }
   CKeyHook::CKeyHook(){}   CKeyHook::~CKeyHook()   {    if( glhHook )Stop();   }   //安装全局钩子。   HHOOK CKeyHook::Start()   {glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//设置键盘钩子。return glhH}   //卸载全局钩子。   BOOL CKeyHook::Stop()   {   BOOL bResult = TRUE; if( glhHook )   bResult = UnhookWindowsHookEx(glhHook);//卸载键盘钩子。   return bR   }
  (7).修改DllMain函数,代码如下:
   extern "C" int APIENTRY   DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)   {//如果使用lpReserved参数则删除下面这行UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH){  TRACE0("NOtePadHOOK.DLL Initializing!\n");   //扩展DLL仅初始化一次  if (!AfxInitExtensionModule(ActiveKeyDLL, hInstance))return 0;  new CDynLinkLibrary(ActiveKeyDLL);      //把DLL加入动态MFC类库中  glhInstance = hI  //插入保存DLL实例句柄}else if (dwReason == DLL_PROCESS_DETACH){  TRACE0("NotePadHOOK.DLL Terminating!\n");  //终止这个链接库前调用它  AfxTermExtensionModule(ActiveKeyDLL);}return 1;   }
  (8).编译项目ActiveKey,生成ActiveKey.DLL和ActiveKey.lib。
  接着,我们还需要创建一个外壳程序将全局钩子安装了Windows系统中,这个外壳程序编写步骤如下:
  (1).创建一个对话框模式的应用程序,项目名为Simulate。
  (2).在主对话框中加入一个按钮,使用ClassWizard为其创建CLICK事件。
  (3).将ActiveKey项目Debug目录下的ActiveKey.DLL和ActiveKey.lib拷贝到Simulate项目目录下。
  (4).从“工程”菜单中选择“设置”,弹出Project Setting对话框,选择Link标签,在“对象/库模块”中输入ActiveKey.lib。
阅读(1996) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。java 写的低级鼠标键盘钩子示例 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 21时,
下载 jna.jar 和 platform.jar
(参考http://my.oschina.net/penngo/blog/12356):
代码片段(2)
1.&[代码][Java]代码&&&&
package jna_
import com.sun.jna.platform.win32.*;
import com.sun.jna.platform.win32.WinUser.*;
import com.sun.jna.platform.win32.WinDef.HMODULE;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HHOOK;
import com.sun.jna.platform.win32.WinUser.KBDLLHOOKSTRUCT;
import com.sun.jna.platform.win32.WinUser.LowLevelKeyboardP
import com.sun.jna.win32.WinUser.Mouse.LowLevelMouseP
import com.sun.jna.win32.WinUser.Mouse.MOUSEHOOKSTRUCT;
public class MouseLLHook {
// 鼠标钩子函数里判断按键类型的常数
public static final int WM_LBUTTONUP = 514;
public static final int WM_LBUTTONDOWN = 513;
public static final int WM_RBUTTONUP = 517;
public static final int WM_RBUTTONDOWN = 516;
public static final int WM_MOUSEHWHEEL = 526;
public static final int WM_MOUSEWHEEL = 522;
public static final int WM_MOUSEMOVE = 512;
static HHOOK mouseHHK,keyboardHHK;//鼠标、键盘钩子的句柄
static LowLevelMouseProc mouseH//鼠标钩子函数
static LowLevelKeyboardProc keyboardH//键盘钩子函数
// 安装钩子
static void setHook() {
HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
mouseHHK = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_MOUSE_LL, mouseHook, hMod, 0);
keyboardHHK = User32.INSTANCE.SetWindowsHookEx(WinUser.WH_KEYBOARD_LL, keyboardHook, hMod, 0);
//卸载钩子
static void unhook() {
User32.INSTANCE.UnhookWindowsHookEx(keyboardHHK);
User32.INSTANCE.UnhookWindowsHookEx(mouseHHK);
public static void main(String[] args) {
keyboardHook = new LowLevelKeyboardProc() {
//该函数参数的意思参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx
public LRESULT callback(int nCode, WPARAM wParam, KBDLLHOOKSTRUCT lParam) {
int w = wParam.intValue();
//按下alt键时w=.WM_SYSKEYDOWN; 按下其他大部分键时w=WinUser.WM_KEYDOWN
if(w==WinUser.WM_KEYDOWN || w==WinUser.WM_SYSKEYDOWN)
System.out.println("key down: vkCode = "+lParam.vkCode);
else if(w==WinUser.WM_KEYUP || w==WinUser.WM_SYSKEYUP)
System.out.println("key up: vkCode = "+lParam.vkCode);
// 如果按下'q'退出程序,'q'的vkCode是81
if(lParam.vkCode==81) {
System.err.println("program terminated.");
System.exit(0);
return User32.INSTANCE.CallNextHookEx(keyboardHHK, nCode, wParam, lParam.getPointer());
mouseHook = new LowLevelMouseProc() {
//该函数参数的意思参考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644986(v=vs.85).aspx
public LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam) {
switch (wParam.intValue()) {
case WM_MOUSEMOVE:
System.out.print("mouse moved:");
case WM_LBUTTONDOWN:
System.out.print("mouse left button down:");
case WM_LBUTTONUP:
System.out.print("mouse left button up");
case WM_RBUTTONUP:
System.out.print("mouse right button up:");
case WM_RBUTTONDOWN:
System.out.print("mouse right button down:");
case WM_MOUSEWHEEL:
System.out.print("mouse wheel rotated:");
System.out.println("("+lParam.pt.x+","+lParam.pt.y+")");
return User32.INSTANCE.CallNextHookEx(mouseHHK, nCode, wParam, lParam.getPointer());
System.out.println("press 'q' to quit.");
setHook();
MSG msg = new MSG();
// 消息循环
// 实际上while循环一次都不执行,这些代码的作用我理解是让程序在GetMessage函数这里阻塞,不然程序就结束了。
while ((result = User32.INSTANCE.GetMessage(msg, null, 0, 0)) != 0) {
if (result == -1) {
System.err.println("error in GetMessage");
User32.INSTANCE.TranslateMessage(msg);
User32.INSTANCE.DispatchMessage(msg);
2.&[代码]以上代码如果有两个类找不到(不知什么原因,我当时下载的版本就可以),那就只好自己写了:&&&&
import com.sun.jna.S
import com.sun.jna.platform.win32.BaseTSD.ULONG_PTR;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.LRESULT;
import com.sun.jna.platform.win32.WinDef.WPARAM;
import com.sun.jna.platform.win32.WinUser.HOOKPROC;
import com.sun.jna.platform.win32.WinUser.POINT;
interface LowLevelMouseProc extends HOOKPROC {
LRESULT callback(int nCode, WPARAM wParam, MOUSEHOOKSTRUCT lParam);
class MOUSEHOOKSTRUCT extends Structure {
public class ByReference extends MOUSEHOOKSTRUCT implements
Structure.ByReference {
public POINT
public HWND
public int wHitTestC
public ULONG_PTR dwExtraI
开源中国-程序员在线工具:
相关的代码(3)
5回/1842阅
2回/1523阅
java也可以钩子了?? 记得之前不可以啊。。我out了 呵呵。研究下你的。
2楼:duty 发表于
哦。是借助本地库阿。
3楼:duty 发表于
哦。是借助本地库阿。
4楼:沙漠仙人掌 发表于
com.sun.jna.win32.WinUser.Mouse.LowLevelMouseProc找不到
5楼:leo-H 发表于
引用来自“breaking”的评论java也可以钩子了?? 记得之前不可以啊。。我out了 呵呵。研究下你的。我试了,只能用LowLevelMouseProc 和 LowLevelKeyboardProc ,其他钩子似乎不能用。不过LowLevelKeyboardProc做一些热键就够了,如果不用钩子做什么坏事的话
6楼:leo-H 发表于
引用来自“breaking”的评论哦。是借助本地库阿。嗯“本地库”什么意思?就引用两个jar文件,也不用dll文件啊
7楼:leo-H 发表于
引用来自“周小飞”的评论com.sun.jna.win32.WinUser.Mouse.LowLevelMouseProc找不到有啊,有两个版本,你是下载这个吗?http://java.net/projects/jna/downloads/directory/3.3.0
8楼:duty 发表于
引用来自“leo_de_macondo”的评论引用来自“周小飞”的评论com.sun.jna.win32.WinUser.Mouse.LowLevelMouseProc找不到有啊,有两个版本,你是下载这个吗?http://java.net/projects/jna/downloads/directory/3.3.0确实是本地库的。你解压那俩个jar包,里头有dll库。com.sun.jna.win32.WinUser.Mouse.LowLevelMouseProc 我也找不到。。两个版本都试过了。可以把你的发到我邮箱么??qinggang. 谢谢你哦呵呵
9楼:duty 发表于
引用来自“leo_de_macondo”的评论引用来自“breaking”的评论哦。是借助本地库阿。嗯“本地库”什么意思?就引用两个jar文件,也不用dll文件啊有各个平台的本地库。。linux unix x86 64位,还有mac。。
10楼:leo-H 发表于
引用来自“breaking”的评论引用来自“leo_de_macondo”的评论引用来自“周小飞”的评论com.sun.jna.win32.WinUser.Mouse.LowLevelMouseProc找不到有啊,有两个版本,你是下载这个吗?http://java.net/projects/jna/downloads/directory/3.3.0确实是本地库的。你解压那俩个jar包,里头有dll库。com.sun.jna.win32.WinUser.Mouse.LowLevelMouseProc 我也找不到。。两个版本都试过了。可以把你的发到我邮箱么??qinggang. 谢谢你哦呵呵发给你了。确实有dll文件,呵呵
11楼:leo-H 发表于
引用来自“breaking”的评论引用来自“leo_de_macondo”的评论引用来自“breaking”的评论哦。是借助本地库阿。嗯“本地库”什么意思?就引用两个jar文件,也不用dll文件啊有各个平台的本地库。。linux unix x86 64位,还有mac。。我记得dll文件是不能放在jar包中的啊。我曾经企图把dll放到我的jar包中,结果我的程序就运行不了。你知道怎么把dll文件打包到jar中么?
12楼:duty 发表于
引用来自“leo_de_macondo”的评论引用来自“breaking”的评论引用来自“leo_de_macondo”的评论引用来自“breaking”的评论哦。是借助本地库阿。嗯“本地库”什么意思?就引用两个jar文件,也不用dll文件啊有各个平台的本地库。。linux unix x86 64位,还有mac。。我记得dll文件是不能放在jar包中的啊。我曾经企图把dll放到我的jar包中,结果我的程序就运行不了。你知道怎么把dll文件打包到jar中么?我也没研究过这个 呵呵
13楼:javacc 发表于
import com.sun.jna.win32.WinUser.Mouse.LowLevelMouseP
import com.sun.jna.win32.WinUser.Mouse.MOUSEHOOKSTRUCT;
这两个类没有找到啊,我下的时3.3.0的那个版本
14楼:whaon 发表于
LZ自己写了类啊
15楼:leo-H 发表于
引用来自“童振豪”的评论LZ自己写了类啊
大家都说下载那两个jar包之后,LowLevelMouseProc和MOUSEHOOKSTRUCT这两个类找不到,所以就自己写了。不过我下载的就没问题,不知为什么
16楼:penngo 发表于
没记错的话,这两个类是在demo里面的,jna已经封装了大部分的window API,鼠标和键盘的钩子都提供了,不过它的DEMO里只有键盘的,鼠标的钩子需要自己扩展。
17楼:older 发表于
能不能把包 发一个给我啊? 谢谢了
18楼:leo-H 发表于
引用来自“older”的评论能不能把包 发一个给我啊? 谢谢了http://www.kuaipan.com.cn/file/id_99221.htm
19楼:帘风 发表于
能不能把包 发一个给我啊? 谢谢了
开源从代码分享开始
leo-H的其它代码}

我要回帖

更多关于 牧马人键盘鼠标怎么样 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信