今天整理檔案,看到這個大二時,剛學習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程式,看完,仿佛又回到了大學時代.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/270559.html
標籤:C++
