发一个奇迹模拟按键代码

MrLee2017-10-24 2953

最近又去回味一下经典游戏——奇迹,玩到了300多级,各种PK,连击,吃药操作跟不上来,于是花了点功夫写了一个小工具,自动狂吃药,技能切换,满足PK需求。下面是核心代码段,使用模式是用DLL注入到游戏进程中。

#include <stdlib.h>
#include <stdio.h>
//导出变量
__declspec(dllexport) bool bWork = true;
//在EXE程序中 __declspec(dllimport) bool bWork;使用
bool IsValidateWindow()
{
	HWND hWnd = GetForegroundWindow();//获取窗口句柄;
	DWORD processID;
	::GetWindowThreadProcessId(hWnd,&processID);
	DWORD dwCurrentProcessId = GetCurrentProcessId();
	return dwCurrentProcessId == processID;//当前窗口句柄不是游戏句柄
}
void KeyPress(int iKeyValue)
{
	INPUT objInput;
	objInput.type = INPUT_KEYBOARD;
	objInput.ki.dwExtraInfo = 0;
	objInput.ki.dwFlags = 0;
	objInput.ki.time = 1;
	objInput.ki.wVk = iKeyValue;
	objInput.ki.wScan = 0;
	if(IsValidateWindow())SendInput(1, &objInput, sizeof(INPUT));
	::Sleep(60);
	objInput.type = INPUT_KEYBOARD;
	objInput.ki.dwExtraInfo = 0;
	objInput.ki.dwFlags = KEYEVENTF_KEYUP;
	objInput.ki.time = 1;
	objInput.ki.wVk = iKeyValue;
	objInput.ki.wScan = 0;
	if(IsValidateWindow())SendInput(1, &objInput, sizeof(INPUT));
}
UINT ThreadKey(LPVOID pVoid)
{
	while (bWork)
	{
		//按1
		KeyPress(0x31);
		Sleep(500);
		//按2
		KeyPress(0x32);
		Sleep(500);
	}
	return 0;
}

生成了DLL之后,用DLL注入器注入就行了,这种代码很多的。我就不上传了。

理论上不用注入也可以,注入一般是为了更有效执行,因为注入以后和宿主是一体的,有足够大的执行权力。

PS后记:确定不用DLL确实也可以。只要判断当前最顶层窗口是不是游戏窗口的句柄即可。

本文链接:https://www.it72.com/12270.htm

推荐阅读
最新回复 (1)
  • MrLee2020-2-26
    HWND hWnd=::FindWindow(_T("#32770"),_T("MsgTest"));
    	if (hWnd!=NULL)
    	{
    		::ShowWindow(hWnd,SW_SHOWNORMAL);
    		::SetForegroundWindow(hWnd);
    		//获取dialog上一个Button按钮的句柄
    		HWND hTargetWnd=::GetDlgItem(hWnd,0x3E8);
    		CRect Rt;
    		::GetWindowRect(hTargetWnd,Rt);
    		//将鼠标光标定位到按钮上
    		SetCursorPos(Rt.left+5,Rt.top+5);
    		INPUT m_InPut[2]={0};
    		//鼠标消息,需将type置为INPUT_MOUSE,如果是键盘消息,将type置为INPUT_KEYBOARD。
    		m_InPut[0].type=m_InPut[1].type=INPUT_MOUSE;
    		//将type置为鼠标消息后,其INPUT结构中的mi结构是可以使用的,hi、ki结构不可使用
    		m_InPut[0].mi.dwFlags=MOUSEEVENTF_LEFTDOWN;
    		m_InPut[1].mi.dwFlags=MOUSEEVENTF_LEFTUP;
    		SendInput(sizeof(m_InPut)/sizeof(m_InPut[0]),m_InPut,sizeof(INPUT));
    	}
    	


返回