cs1.6人物位置转换成屏幕坐标(仅供学习交流使用)

句柄就是操作权限

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;
    }
}

 

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值