今天整理文件,看到这个大二时,刚学习windows程序设计时写的一个魔兽显血工具.取名NoCheating,是想说明自己不是作弊工具,仅仅显示血条而已.

image

vs2019打开,升级,编译,居然还能编译运行

image

image

那个时候刚开始玩魔兽争霸3下面的真三国无双,当时魔兽的版本还不能自动显示人物血条,需要按下[键显示己方血条,或者]键显示敌方血条,或者alt键显示双方血条.所以每次打架在补兵的时候,就很有节奏的按着alt键,按一下,补一下兵,按一下补一下兵(后来,魔兽升级后有了自动显示血条功能后,不用按alt键了,反而不习惯了).于是就想着写一个工具,自动显示血条.
原理很简单,就是模拟用户按下[,]两个键.
具体的实现用到了当时学的windows程序设计的内容.重新看看这个内容,还能重温一下windows程序设计的基本步骤和框架.

首先是windows程序设计的入口函数WinMain.
其参数包括hInstance当前实例句柄,和hPrevInstance(一般为空),和命令行参数,以及窗口显示方式.

其次就是典型的windows程序设计步骤.
设计一个窗口类: 即定义WNDCLASS对象,并设置参数.
注册窗口对象: RegisterClass.
创建窗口对象: CreateWindow.
显示窗口:ShowWindow.
更新窗口: UpdateWindow.
然后最重要的,消息循环:

while(GetMessage(&msg,NULL,0,0))
{
	TranslateMessage(&msg);
	DispatchMessage(&msg);
}

接着在WndProc回调函数中处理windows消息:
窗口创建消息中创建2个timer
在timer1消息中通过FindWindow找到魔兽窗口句柄.
在timer2消息中向魔兽窗口发送[]按键消息.
窗口销毁消息中关闭timer,关闭魔兽窗口句柄,发送退出程序消息.

#include<windows.h>
#include<tlhelp32.h>
#include<TCHAR.h>

#define IDT_TIMER1 1			
#define IDT_TIMER2 2			

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(
		   HINSTANCE hInstance,      
		   HINSTANCE hPrevInstance,  
		   LPSTR lpCmdLine,          
		   int nCmdShow              
		   )
{
	static TCHAR szAppName[]=TEXT("NoCheating");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;
	
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
	wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
	wndclass.hInstance = hInstance;
	wndclass.lpfnWndProc = WndProc;
	wndclass.lpszClassName = szAppName;
	wndclass.lpszMenuName = NULL;
	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	
	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("This application need windows NT!"),
			szAppName,MB_ICONERROR);
		return 0;
	}
	
	hwnd = CreateWindow(
		szAppName,				    
		TEXT("不作弊"),				
		WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME,      
		GetSystemMetrics(SM_CXSCREEN) / 2 - 100,   
		GetSystemMetrics(SM_CYSCREEN) / 2 - 50,    
		200,					    
		100,				        
		NULL,					    
		NULL,					    
		hInstance,				    
		NULL					    
		);
	
	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);
	
	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	static HANDLE hWar;
	static BOOL bGetID;
	
	switch(message)
	{
	case WM_CREATE:
		SetTimer(hwnd,IDT_TIMER1,10000,NULL);
		SetTimer(hwnd,IDT_TIMER2,10000,NULL);
		
		return 0;

	case WM_TIMER:
		switch(wParam)
		{
		case IDT_TIMER1:
			hWar = FindWindow(NULL,"Warcraft III");
			bGetID = hWar ? TRUE : FALSE;

			break;
			
		case IDT_TIMER2:
			if(bGetID)
			{
				SendMessage(hWar,WM_KEYDOWN,0xDB,0);
				SendMessage(hWar,WM_KEYDOWN,0xDD,0);
			}

			break;
		}
		return 0;

	case WM_DESTROY:

		KillTimer(hwnd,IDT_TIMER2);
		CloseHandle(hWar);
		PostQuitMessage(0);
		return 0;

	default:
		return DefWindowProc(hwnd,message,wParam,lParam);

	}
}

许久不写windows程序,看完,仿佛又回到了大学时代.

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/ideryi/p/14599692.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!

相关课程