AI智能
改变未来

十一年前上大二时用c语言写的NoCheating魔兽显血工具

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

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

那个时候刚开始玩魔兽争霸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 2LRESULT 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程序,看完,仿佛又回到了大学时代.

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 十一年前上大二时用c语言写的NoCheating魔兽显血工具