经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
十一年前上大二时用c语言写的NoCheating魔兽显血工具
来源:cnblogs  作者:ideryi  时间:2021/4/6 10:18:04  对本文有异议

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

image

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

image

image

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

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

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

  1. while(GetMessage(&msg,NULL,0,0))
  2. {
  3. TranslateMessage(&msg);
  4. DispatchMessage(&msg);
  5. }

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

  1. #include<windows.h>
  2. #include<tlhelp32.h>
  3. #include<TCHAR.h>
  4. #define IDT_TIMER1 1
  5. #define IDT_TIMER2 2
  6. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
  7. int WINAPI WinMain(
  8. HINSTANCE hInstance,
  9. HINSTANCE hPrevInstance,
  10. LPSTR lpCmdLine,
  11. int nCmdShow
  12. )
  13. {
  14. static TCHAR szAppName[]=TEXT("NoCheating");
  15. HWND hwnd;
  16. MSG msg;
  17. WNDCLASS wndclass;
  18. wndclass.cbClsExtra = 0;
  19. wndclass.cbWndExtra = 0;
  20. wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  21. wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
  22. wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
  23. wndclass.hInstance = hInstance;
  24. wndclass.lpfnWndProc = WndProc;
  25. wndclass.lpszClassName = szAppName;
  26. wndclass.lpszMenuName = NULL;
  27. wndclass.style = CS_HREDRAW | CS_VREDRAW;
  28. if(!RegisterClass(&wndclass))
  29. {
  30. MessageBox(NULL,TEXT("This application need windows NT!"),
  31. szAppName,MB_ICONERROR);
  32. return 0;
  33. }
  34. hwnd = CreateWindow(
  35. szAppName,
  36. TEXT("不作弊"),
  37. WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME,
  38. GetSystemMetrics(SM_CXSCREEN) / 2 - 100,
  39. GetSystemMetrics(SM_CYSCREEN) / 2 - 50,
  40. 200,
  41. 100,
  42. NULL,
  43. NULL,
  44. hInstance,
  45. NULL
  46. );
  47. ShowWindow(hwnd,nCmdShow);
  48. UpdateWindow(hwnd);
  49. while(GetMessage(&msg,NULL,0,0))
  50. {
  51. TranslateMessage(&msg);
  52. DispatchMessage(&msg);
  53. }
  54. return msg.wParam;
  55. }
  56. LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
  57. {
  58. static HANDLE hWar;
  59. static BOOL bGetID;
  60. switch(message)
  61. {
  62. case WM_CREATE:
  63. SetTimer(hwnd,IDT_TIMER1,10000,NULL);
  64. SetTimer(hwnd,IDT_TIMER2,10000,NULL);
  65. return 0;
  66. case WM_TIMER:
  67. switch(wParam)
  68. {
  69. case IDT_TIMER1:
  70. hWar = FindWindow(NULL,"Warcraft III");
  71. bGetID = hWar ? TRUE : FALSE;
  72. break;
  73. case IDT_TIMER2:
  74. if(bGetID)
  75. {
  76. SendMessage(hWar,WM_KEYDOWN,0xDB,0);
  77. SendMessage(hWar,WM_KEYDOWN,0xDD,0);
  78. }
  79. break;
  80. }
  81. return 0;
  82. case WM_DESTROY:
  83. KillTimer(hwnd,IDT_TIMER2);
  84. CloseHandle(hWar);
  85. PostQuitMessage(0);
  86. return 0;
  87. default:
  88. return DefWindowProc(hwnd,message,wParam,lParam);
  89. }
  90. }

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号