十一年前上大二时用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 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程序,看完,仿佛又回到了大学时代.
- C语言 整数字符串转换成int整数
- 我理解的C语言模块化编程
- PAT 1054求平均值的代码实现及错误分析(C语言)
- 消去无序数组中的重复元素(c语言)
- C语言声明数组变量时,在什么情况下,可不指定数组大小
- C语言step-by-step(三)(运算与表达式)
- 黑马程序员-----C语言学习之数组与指针
- 在linux下用gsoap实现c语言的webservice实例
- 小女也爱C#(4)---由C语言引入C#
- C语言和C++面试常考点
- C语言中 fp = fopen(filename, “rb”); 那个rb是什么意思啊
- 总结C语言中const关键字的使用
- C语言编程心得(一)
- 在Linux和Android中用C语言写系统日志
- PK字符串匹配(C语言)
- C语言之typedef的问题
- C语言之数据的存储类别
- visual studio 2012进行C语言开发[图文]
- c语言中有符号和无符号数据类型的区别
- C语言递归函数