当前位置:天才代写 > tutorial > C语言/C++ 教程 > 用游戏哄骗杆摸拟鼠标

用游戏哄骗杆摸拟鼠标

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:399

副标题#e#

要编写一个支持游戏哄骗杆的应用措施,首先必需要捕捉游戏哄骗杆,接着要处理惩罚Windows发送给措施窗口的哄骗杆动静,最后利用完哄骗杆后,还应将捕捉的哄骗杆资源释放。

挪用API函数joySetCapture能捕捉游戏哄骗杆。挪用joySetCapture函数后,哄骗杆发生的所有动静将会发送到指定的窗口。它的原型为:

MMRESULT joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged );

个中,参数hwnd为吸收哄骗杆动静的窗口句柄;参数uJoyID为要捕捉的哄骗杆标识,它可以是JOYSTICKID1或是JOYSTICKID2,即第一、第二个游戏哄骗杆;参数uPeriod为轮询的频率,单元为毫秒,它指定给应用措施发送有关哄骗杆信息的隔断时间;参数fChanged为改变位置标识,可设为false。

要释放哄骗杆的捕捉时,利用joyReleaseCapture函数。它只有一个参数,就是哄骗杆的标识JOYSTICKID1或JOYSTICKID2。

下面,就让我们用Borland C++ Builder 5.0来做一个用游戏哄骗杆模仿鼠标的措施。

运行Borland C++ Builder 5.0,双击窗体Form1,在Form1的OnCreate事件中插手以下代码捕捉一个游戏哄骗杆:

void __fastcall TForm1::FormCreate(Tobject *Sender)
{
int JoyMsg;
//捕捉游戏哄骗杆
JoyMsg=joySetCapture(Handle,JOYSTICKID1,0,false);
if(JoyMsg==JOYERR_NOCANDO)
{
//捕捉失败
ShowMessage("不能捕捉游戏杆!");
}
else
{
if(JoyMsg==JOYERR_UNPLUGGED)
{
//没有毗连
ShowMessage("游戏杆未与系统毗连!");
}
else
{
if(JoyMsg==MMSYSERR_NODRIVER)
{
//没有安装
ShowMessage("系统没有安装游戏杆!");
}
else
{
//捕捉乐成
ShowMessage("捕捉游戏杆乐成!");
}
}
}
在Form1的OnCloseQuery事件中插手代码,让措施封锁时释放哄骗杆捕捉的资源:
void __fastcall TForm1::FormCloseQuery(Tobject *Sender, bool &CanClose)
{
//释放哄骗杆捕捉
joyReleaseCapture(JOYSTICKID1);
}

捕捉游戏哄骗杆后,Windows会把所有的哄骗杆动静发送给窗口Form1。当哄骗杆的偏向钮按被按下时,发生的是MM_JOY1MOVE动静,当成果按钮被按下时,发生MM_JOY1BUTTONDOWN动静。在措施中别离响应并处理惩罚这两个动静,就可以模仿鼠标的移动和点击。

可是在C++ Builder中,这两条动静并不是尺度的Windows动静,这就需要我们自已界说和处理惩罚动静了。在C++ Builder里响应自界说动静的步调为:

1.成立动静映射表

2.声明动静处理惩罚函数

3.编写动静处理惩罚函数

首先在代码编辑窗口点击右键,选择弹出菜单的“Open Source/Header File”或是按热键Ctrl+F6,打开窗体Form1头文件“Uint1.h”。

在窗体的TForm1类中的公有成员中插手代码来成立动静映射表,把动静的处理惩罚权交给自界说的动静处理惩罚函数:

public:

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(MM_JOY1BUTTONDOWN,Tmessage,OnJoyDown)

MESSAGE_HANDLER(MM_JOY1MOVE,Tmessage,OnJoyMove)

END_MESSAGE_MAP(Tform)

然后在类的私有成员中插手代码声明动静处理惩罚函数:

private:

void __fastcall OnJoyDown(Tmessage &Message);

void __fastcall OnJoyMove(Tmessage &Message);


#p#副标题#e#

最后,按Ctrl+F6键切换回“Uint1.cpp”的编辑窗口,在末端空缺处添加下面两个自界说的动静响应函数:

//自界说的MM_JOY1BUTTONDOWN动静响应函数OnJoyDown
void __fastcall TForm1::OnJoyDown(Tmessage &Message)
{
if(Message.Wparam & JOY_BUTTON1)
{
//模仿鼠标左键按下
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
Caption="左键按下";
}
if(Message.Wparam & JOY_BUTTON2)
{
//模仿鼠标右键按下
mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);
Caption="右键按下";
}
if(Message.Wparam & JOY_BUTTON3)
{
//模仿鼠标左键抬起
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
Caption="左键抬起";
}
if(Message.Wparam & JOY_BUTTON4)
{
//模仿鼠标右键抬起
mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);
Caption="右键抬起";
}
//继承通报动静
Tform::Dispatch(&Message);
}
//自界说的MM_JOY1MOVE动静响应函数OnJoyDown
void __fastcall TForm1::OnJoyMove(Tmessage &Message)
{
int x,y;
POINT pt;
//取得鼠标当前坐标
GetCursorPos(&pt);
x=LOWORD(Message.Lparam);
y=HIWORD(Message.Lparam);
if(x!=32678)
{
if(x)
{
//向右
pt.x+=10;
}
else
{
//向左
pt.x-=10;
}
}
if(y!=32678)
{
if(y)
{
//向下
pt.y+=10;
}
else
{
//向上
pt.y-=10;
}
}
//配置鼠标坐标
SetCursorPos(pt.x,pt.y);
//继承通报动静
Tform::Dispatch(&Message);
}

#p#分页标题#e#

留意:调试运行这个措施,系统必需要安装有游戏哄骗杆。自界说的动静处理惩罚函数末端最好加一句 TForm1::Dispatch(&Message),这条语句的浸染是让动静继承通报下去。Windows是利用用动静处理惩罚机制的,假如没有这一句语句,动静将完全被拦截,Windows措施大概由于得不到动静而无法实现正常的成果。

 

    关键字:

天才代写-代写联系方式