实现DX游戏的键盘鼠标操作

*碰到DX游戏SendMessage 和PostMessage是没办法使用模拟键盘鼠标操作的,这时候我们可以用到一个SendInput把键盘鼠标消息放到消息队列里面去实现 代码如下:

模拟鼠标

int   SuccessAction1, SuccessAction2, SuccessAction3;
	INPUT   MouseInput[3];
int x=200,y=200;
	///////////////////////////////////////第一个动作:模拟鼠标移动到指定位置    
	MouseInput[0].type = INPUT_MOUSE;//虚拟的类型 INPUT_MOUSE or INPUT_KEY
	////////////////////////////////////
	MouseInput[0].hi.uMsg = NULL;
	MouseInput[0].hi.wParamH = NULL;
	MouseInput[0].hi.wParamL = NULL;
	/////////////////////键盘消息////////////////////////////////////
	MouseInput[0].ki.dwExtraInfo = NULL;
	MouseInput[0].ki.dwFlags = NULL;//键盘的消息
	MouseInput[0].ki.time = NULL;
	MouseInput[0].ki.wScan = NULL;//键盘扫描码
	MouseInput[0].ki.wVk = NULL;//键盘VK码
	/////////////////////鼠标消息////////////////////////////////////
	MouseInput[0].mi.dwExtraInfo = NULL;
	MouseInput[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE; //鼠标标志 MOUSEEVENTF_LEFTDOWN  MOUSEEVENTF_ABSOLUTE
	MouseInput[0].mi.dx = x;//鼠标x坐标
	MouseInput[0].mi.dy = y;//鼠标y坐标
	MouseInput[0].mi.mouseData = NULL;
	MouseInput[0].mi.time = NULL;
	Sleep(10);
	SuccessAction1 = SendInput(3, MouseInput, sizeof(INPUT));//发送鼠标动作到消息序列。

	///////////////////////////////////////第二个动作:模拟鼠标移动到指定位置    
	MouseInput[1].type = INPUT_MOUSE;//虚拟的类型 INPUT_MOUSE or INPUT_KEY
	///////////////////////////////////////////////////////
	MouseInput[1].hi.uMsg = NULL;
	MouseInput[1].hi.wParamH = NULL;
	MouseInput[1].hi.wParamL = NULL;
	/////////////////////键盘消息////////////////////////////////////
	MouseInput[1].ki.dwExtraInfo = NULL;
	MouseInput[1].ki.dwFlags = NULL;//键盘的消息
	MouseInput[1].ki.time = NULL;
	MouseInput[1].ki.wScan = NULL;//键盘扫描码
	MouseInput[1].ki.wVk = NULL;//键盘VK码
	/////////////////////鼠标消息////////////////////////////////////
	MouseInput[1].mi.dwExtraInfo = NULL;
	MouseInput[1].mi.dwFlags = MOUSEEVENTF_RIGHTDOWN;//鼠标标志 MOUSEEVENTF_LEFTDOWN 
<span style="white-space:pre">	</span>MouseInput[0].mi.dx = (65535 / (GetSystemMetrics(SM_CXSCREEN) - 1))* x;//鼠标x坐标
<span style="white-space:pre">	</span>MouseInput[0].mi.dy = (65535 / (GetSystemMetrics(SM_CYSCREEN) - 1))* y;//鼠标y坐标
	MouseInput[1].mi.mouseData = NULL;
	MouseInput[1].mi.time = NULL;
	Sleep(10);
	SuccessAction2 = SendInput(3, MouseInput, sizeof(INPUT));//发送鼠标动作到消息序列。

	///////////////////////////////////////第三个动作:模拟鼠标右键释放  
	MouseInput[1].type = INPUT_MOUSE;//虚拟的类型 INPUT_MOUSE or INPUT_KEY

	MouseInput[1].hi.uMsg = NULL;
	MouseInput[1].hi.wParamH = NULL;
	MouseInput[1].hi.wParamL = NULL;
	/////////////////////键盘消息////////////////////////////////////
	MouseInput[1].ki.dwExtraInfo = NULL;
	MouseInput[1].ki.dwFlags = NULL;//键盘的标志
	MouseInput[1].ki.time = NULL;
	MouseInput[1].ki.wScan = NULL;//键盘扫描码
	MouseInput[1].ki.wVk = NULL;//键盘VK码
	/////////////////////鼠标消息////////////////////////////////////
	MouseInput[1].mi.dwExtraInfo = NULL;
	MouseInput[1].mi.dwFlags = MOUSEEVENTF_RIGHTUP;//鼠标标志 MOUSEEVENTF_LEFTUP
	MouseInput[1].mi.dx = x;//鼠标x坐标
	MouseInput[1].mi.dy = y;//鼠标y坐标
	MouseInput[1].mi.mouseData = NULL;
	MouseInput[1].mi.time = NULL;
	Sleep(10);
	SuccessAction3 = SendInput(3, MouseInput, sizeof(INPUT));//发送鼠标动作到消息序列。

经过三个步骤我们去实现了 鼠标移动到指定点,在指定点进行鼠标点击 弹起 操作。(上面这么多代码,我是为了让大家自己去扩展功能,实际上模拟鼠标只用到Flags和type,鼠标x和y而已,大家在用的时候把其他的代码删掉即可,但是对此结构不了解的可以多看看)
键盘的话只要把Type改一下,把VK或者扫描码设置一下,为了方便,我们可以封装一下整个过程,到调用起来就很方便了。

模拟组合键
<span style="font-size:10px;"></span><span style="white-space:pre">	</span>INPUT KeyInput[4];
<span style="white-space:pre">	</span>memset(KeyInput, 0, sizeof(KeyInput));
<span style="white-space:pre">	</span>//设置模拟键盘输入
<span style="white-space:pre">	</span>KeyInput[0].type = INPUT_KEYBOARD;
<span style="white-space:pre">	</span>KeyInput[1].type = INPUT_KEYBOARD;
<span style="white-space:pre">	</span>KeyInput[2].type = INPUT_KEYBOARD;
<span style="white-space:pre">	</span>KeyInput[3].type = INPUT_KEYBOARD;


<span style="white-space:pre">	</span>KeyInput[0].ki.wVk = VK_CONTROL;//Ctrl虚拟码
<span style="white-space:pre">	</span>KeyInput[2].ki.wVk = VK_CONTROL;//Ctrl虚拟码
<span style="white-space:pre">	</span>KeyInput[1].ki.wVk = 86;//虚拟码86是V
<span style="white-space:pre">	</span>KeyInput[3].ki.wVk = 86;//虚拟码86是V


<span style="white-space:pre">	</span>// 弹起按键
<span style="white-space:pre">	</span>KeyInput[2].ki.dwFlags = KEYEVENTF_KEYUP;//弹起Ctrl
<span style="white-space:pre">	</span>KeyInput[3].ki.dwFlags = KEYEVENTF_KEYUP;//弹起V
<span style="white-space:pre">	</span>SendInput(4, KeyInput,sizeof(INPUT));//把消息发送到消息队列<span style="font-size:10px;"></span>




模拟按键

<span style="font-size:10px;">	INPUT KeyInput[2];
	memset(KeyInput, 0, sizeof(KeyInput));
	//设置模拟键盘输入
	KeyInput[0].type = INPUT_KEYBOARD;
	KeyInput[1].type = INPUT_KEYBOARD;

	KeyInput[0].ki.wVk = 86;//虚拟码86是V
	KeyInput[1].ki.wVk = 86;//虚拟码86是V

	// 弹起按键
	KeyInput[1].ki.dwFlags = KEYEVENTF_KEYUP;//弹起V
	SendInput(2, KeyInput, sizeof(INPUT));//把消息发送到消息队列</span>

这三个功能有一个缺点就是非后台操作,这是全局的一个操作,但是至少实现了Dx游戏的模拟键盘鼠标!

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nonecode/article/details/31472149
个人分类: 其他
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭