句柄就是操作权限
findwindow 用于处理顶级窗口的类名和窗口名称
在vscode的工具里面有一个可以获取窗口名的工具
cs1.6
句柄:018F10AA 标题:Counter-Strike 类:Valve001
#include <iostream>
#include <Windows.h>
int main() {
//HWND winhwnd = (HWND)0x018F10AA; //窗口类型
//HWND winhwnd = FindWindow(NULL, L"你好"); //根据窗口名获取句柄
HWND windows = FindWindow(L"Valve001", NULL); //根据类名获取窗口句柄
printf("窗口句柄=%p\r\n", windows);
SetWindowTextA(windows, "cuola"); //修改窗口标题 重启后
printf("窗口句柄大小=%d", sizeof(windows)); //64位下占用8字节 32位下占用4字节
getchar();
return 0;
}
windows api 获取进程编号
#include <iostream>
#include <Windows.h>
int main() {
HWND h = FindWindow(L"Valve001", NULL);
printf("%p",h);
DWORD pid, tid;
//DWORD* 等价于LPDWORD
tid = GetWindowThreadProcessId(h, &pid);
printf("tid=%d,pid=%d", tid,pid);
}
OpenProcess()
可以传入不同权限
ReadProcessMemory()
WriteProcessMemory
根据三角函数的计算方式
mian.h
#include "accessMemory.h"
#define M_PI 3.14159265358979323846
using namespace std;
int main() {
map<string, int> XYsize;
HWND h = FindWindow(L"Valve001", NULL);
DWORD pid;
GetWindowThreadProcessId(h, &pid);
// 获取当前进程的句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
HMODULE hModules[1024];
HMODULE mkdz = 0;
DWORD needed;
if (EnumProcessModules(hProcess, hModules, sizeof(hModules), &needed)) {
wchar_t Modulename[MAX_MODULE_NAME_SIZE];
for (int i = 0; i < (needed / sizeof(HMODULE)); i++) {
if (GetModuleBaseNameW(hProcess, hModules[i], Modulename, MAX_MODULE_NAME_SIZE) != 0) {
if (wcscmp(Modulename, L"cstrike.exe") == 0) {
mkdz = hModules[i];
break;
}
}
}
}
//FOV得到
int FOVshifting[3] = { 0x11069BC,0x7C, 0x5C4};
int mouseXshifting[1] = { 0x19E10C4 + 0x4 };
int mouseYshifting[1] = { 0x19E10C4 };
int EnemycoorX[3] = { 0x1117C64,0x4B9C,0x3ac };
int EnemycoorY[3] = { 0x1117C64,0x4B9C,0x3B0 };
int EnemycoorZ[3] = { 0x1117C64,0x4B9C,0x3B4 };
int selfX[3] = { 0x1117C64,0x4B9C ,0x88 };
int selfY[3] = { 0x1117C64,0x4B9C ,0x88 +0x4};
int selfZ[3] = { 0x1117C64,0x4B9C ,0x88 +0x8};
HDC hdc = GetDC(h);
SetTextColor(hdc, RGB(255, 0, 0));
SetBkMode(hdc, TRANSPARENT);
HPEN hRedPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); // 红色画笔
HGDIOBJ oldPen = SelectObject(hdc, hRedPen); // 选择红色画笔
RECT rect;
GetClientRect(h, &rect);
int width = (rect.right - rect.left)/2;
int height = (rect.bottom - rect.top)/2;
int mouseXtemp = 0;
int plzm = 0;
while (true)
{
bool appear = 0;
unsigned int FOV = ReadMemoryData_array(hProcess, FOVshifting, (unsigned int)mkdz, 3, 1); //角度
float enemyX = ReadMemoryData_array(hProcess, EnemycoorX, (unsigned int)mkdz, 3, 1.1f); //敌人x
float enemyY = ReadMemoryData_array(hProcess, EnemycoorY, (unsigned int)mkdz, 3, 1.1f); //敌人y
float enemyZ = ReadMemoryData_array(hProcess, EnemycoorZ, (unsigned int)mkdz, 3, 1.1f); //敌人z
float mouseX = ReadMemoryData_array(hProcess, mouseXshifting, (unsigned int)mkdz, 1, 1.1f); //鼠标x
float mouseY = ReadMemoryData_array(hProcess, mouseYshifting, (unsigned int)mkdz, 1, 1.1f); //鼠标y
float selfXw = ReadMemoryData_array(hProcess, selfX, (unsigned int)mkdz, 3, 1.1f); //自己坐标x
float selfYw = ReadMemoryData_array(hProcess, selfY, (unsigned int)mkdz, 3, 1.1f); //自己坐标y
float selfZw = ReadMemoryData_array(hProcess, selfZ, (unsigned int)mkdz, 3, 1.1f); //自己坐标z
mouseXtemp = mouseX;
if (mouseX > 180) {
mouseXtemp -= 360;
}
int XDifference = enemyX - selfXw; //X轴距离
int YDifference = enemyY - selfYw; //Y轴距离
int distance = sqrt(pow(XDifference, 2) + pow(YDifference, 2)); //玩家与敌人的距离
double XaddYangle = atan2(YDifference , XDifference) * 180 / M_PI; //敌人关于X轴的夹角
double BetweenX = mouseXtemp - XaddYangle; //敌人与鼠标的夹角;
double opposite = distance * sin(BetweenX * M_PI / 180); //对边长度
double adjacent = opposite / tan(BetweenX * M_PI / 180);
double pmzb = 512.0 + opposite / adjacent * 512;
int SMz = enemyZ - selfZw;
double triangle = atan2(distance, SMz) * 180.0 / M_PI;
cout << triangle << '\n';
//cout << pmzb << '\n';
std::wstring enemyText = L"敌人坐标X:" + to_wstring(enemyX) + L" Y:" + to_wstring(enemyY) + L" Z;" + to_wstring(enemyZ);
std::wstring selfText = L"自己坐标X:" + to_wstring(selfXw) + L" Y:" + to_wstring(selfYw) + L" Z;" + to_wstring(selfZw);
std::wstring mouseText = L"鼠标坐标X:" + to_wstring(mouseXtemp) + L" Y:" + to_wstring(mouseY);
std::wstring FOVText = L"视角大小:" + to_wstring(FOV);
std::wstring distanceText = L"玩家与敌人的距离:" + to_wstring(distance);
std::wstring XaddYangleText = L"敌人与X轴的夹角:" + to_wstring(XaddYangle);
std::wstring BetweenXText = L"敌人与鼠标的夹角:" + to_wstring(BetweenX);
std::wstring oppositeText = L"对边长度:" + to_wstring(opposite);
std::wstring adjacentText = L"邻边长度:" + to_wstring(adjacent);
TextOut(hdc, 0, 150, enemyText.c_str(), enemyText.length());
TextOut(hdc, 0, 170, selfText.c_str(), selfText.length());
TextOut(hdc, 0, 190, mouseText.c_str(), mouseText.length());
TextOut(hdc, 0, 210, FOVText.c_str(), FOVText.length());
TextOut(hdc, 0, 230, distanceText.c_str(), distanceText.length());
TextOut(hdc, 0, 270, XaddYangleText.c_str(), XaddYangleText.length());
TextOut(hdc, 0, 290, BetweenXText.c_str(), BetweenXText.length());
TextOut(hdc, 0, 310, oppositeText.c_str(), oppositeText.length());
TextOut(hdc, 0, 330, adjacentText.c_str(), adjacentText.length());
//TextOut(hdc, 0, 350, duibianText.c_str(), duibianText.length());
if ((BetweenX > 46 or BetweenX < -46) and BetweenX <= 315) {
continue;
}
else
{
MoveToEx(hdc, pmzb, 0, NULL); // 直线起点
LineTo(hdc, pmzb, 768); // 直线终点
}
}
}
accessMemory.h
#pragma once
#include <iostream>
#include <Windows.h>
#include <string>
#include <Psapi.h>
#include <cstdint>
#include <format>
#include<cmath>
#include <map>
#define MAX_MODULE_NAME_SIZE 256
unsigned int ReadMemoryData_array(HANDLE handle, int* array, unsigned int baseaddress, int size, int types);
float ReadMemoryData_array(HANDLE handle, int* array, unsigned int baseaddress, int size, float types);
accessMemory.cpp
#include "accessMemory.h"
//传入句柄和基地址,偏移,得到最终的值
//HANDLE handle 句柄
//int* array 偏移数组
//unsigned int baseaddress 基地址
// int size 数组大小
// types 指定返回值类型
unsigned int ReadMemoryData_array(HANDLE handle, int* array, unsigned int baseaddress,int size,int types){
unsigned int bufferr;
if (size !=0) {
unsigned int addressm = baseaddress;
for (int i = 0; i < size; i++)
{
unsigned int shifting = array[i];
ReadProcessMemory(handle, (LPCVOID)(addressm+shifting), &bufferr, 4, 0);
addressm = bufferr;
}
return (unsigned int)bufferr;
}
else {
ReadProcessMemory(handle, (LPCVOID)baseaddress, &bufferr, 4, 0);
return (unsigned int)bufferr;
}
}
float ReadMemoryData_array(HANDLE handle, int* array, unsigned int baseaddress, int size, float types) {
unsigned int bufferr;
float bufferrfloat;
if (size != 0) {
unsigned int addressm = baseaddress;
for (int i = 0; i < size; i++)
{
unsigned int shifting = array[i];
if (i == size-1) {
ReadProcessMemory(handle, (LPCVOID)(addressm + shifting), &bufferrfloat, 4, 0);
return bufferrfloat;
}
ReadProcessMemory(handle, (LPCVOID)(addressm + shifting), &bufferr, 4, 0);
addressm = bufferr;
}
}
else {
ReadProcessMemory(handle, (LPCVOID)baseaddress, &bufferr, 4, 0);
return (float)bufferr;
}
}