c++学习笔记- 自制魔兽显血改键

本文介绍了一种在《魔兽III》游戏中实现显示血量和修改键盘按键功能的方法。通过模拟键盘输入和使用WH_KEYBOARD_LL钩子技术,可以在游戏运行时改变特定按键的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

源代码下载地址:点击打开链接

显血:

    模拟键盘按键'['和']'来达到显血效果。

   

void CMsxxDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==1)
	{
		hWnd=::GetForegroundWindow();//获取当前窗口句柄
		::GetWindowText(hWnd,wText,50);
		if(strcmp(wText,"Warcraft III")==0)//如果是魔兽窗口则模拟按键
		{
			if(flag==0)
			{
            	             keybd_event(219,0,0,0); 
	         	             keybd_event(221,0,0,0);
			    flag=1;
			}
		}
		else
		{
			flag=0;
		}

	}
	CDialog::OnTimer(nIDEvent);
}


改键:

      用到WH_KEYBOARD_LL钩子,先创建一个MFC规则的dll将功能函数都放到里面。

     先在头文件中添加变量和函数

   

int v1,v2,v4,v5,v7,v8;//修改关联小键盘的虚拟键码

HHOOK g_hHook;
HINSTANCE g_hInstanceHandle=NULL;
extern "C" _declspec(dllexport) BOOL StartHook(int t1,int t2,int t4,int t5,int t7,int t8);//初始化钩子
extern "C" _declspec(dllexport) BOOL StopHook();//停止钩子


 在cpp中实现函数功能

1.钩子回调函数

LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	//先获取当前窗口看是否为魔兽窗口
	char str[30];
	::GetWindowText(::GetForegroundWindow(),str,30);
	if(strcmp(str,"Warcraft III")==0)
	{
		if(nCode==HC_ACTION)
		{
			LPKBDLLHOOKSTRUCT lpk=(LPKBDLLHOOKSTRUCT)lParam;
			//1
			if(lpk->vkCode==v1)
			{
				if(wParam==WM_KEYDOWN)
				{
					keybd_event(97,0,0,0);
				}
				else
				if(wParam==WM_KEYUP)
				{
					keybd_event(97,0,KEYEVENTF_KEYUP,0);
				}
				return 1;
			}
			//2
			if(lpk->vkCode==v2)
			{
				if(wParam==WM_KEYDOWN)
				{
					keybd_event(98,0,0,0);
				}
				else
				if(wParam==WM_KEYUP)
				{
					keybd_event(98,0,KEYEVENTF_KEYUP,0);
				}
				return 1;
			}
			//4
			if(lpk->vkCode==v4)
			{
				if(wParam==WM_KEYDOWN)
				{
					keybd_event(100,0,0,0);
				}
				else
				if(wParam==WM_KEYUP)
				{
					keybd_event(100,0,KEYEVENTF_KEYUP,0);
				}
				return 1;
			}
			//5
			if(lpk->vkCode==v5)
			{
				if(wParam==WM_KEYDOWN)
				{
					keybd_event(101,0,0,0);
				}
				else
				if(wParam==WM_KEYUP)
				{
					keybd_event(101,0,KEYEVENTF_KEYUP,0);
				}
				return 1;
			}
			//7
			if(lpk->vkCode==v7)
			{
				if(wParam==WM_KEYDOWN)
				{
					keybd_event(103,0,0,0);
				}
				else
				if(wParam==WM_KEYUP)
				{
					keybd_event(103,0,KEYEVENTF_KEYUP,0);
				}
				return 1;
			}
			//8
			if(lpk->vkCode==v8)
			{
				if(wParam==WM_KEYDOWN)
				{
					keybd_event(104,0,0,0);
				}
				else
				if(wParam==WM_KEYUP)
				{
					keybd_event(104,0,KEYEVENTF_KEYUP,0);
				}
				return 1;
			}


		}
	}
	LRESULT lRetVal=CallNextHookEx(g_hHook,nCode,wParam,0);
	return lRetVal;
	
}


2.初始化钩子

extern "C" _declspec(dllexport) BOOL StartHook(int t1,int t2,int t4,int t5,int t7,int t8)
{
	v1=t1;
	v2=t2;

	v4=t4;
	v5=t5;

	v7=t7;
	v8=t8;
	g_hHook=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyboardProc,g_hInstanceHandle,0);
	return TRUE;
}


3.卸载钩子

extern "C" _declspec(dllexport) BOOL StopHook()
{
	if(g_hHook)
	{
		return UnhookWindowsHookEx(g_hHook);
	}
	return TRUE;
}


最后在主程序中调用dll时将修改6个小键盘的虚拟键码传递进来就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值