Python实现-透视方框绘制

embedded/2024/9/23 21:51:53/

前言

对于FPS游戏的外挂,最常见的就是透视,而透视必然要用到方框绘制功能,C++和易语言在这方面的教程比比皆是,但是Python搜出来的几乎全是用PyGame或小海龟在自身创建的窗口上绘制方框,然后你就会想:“哥们!!!我是要在其他程序上绘制方框啊!!”,当然实际上你以为的这种绘制也并非是真正的在FPS窗口上绘制,请看如下原理。

原理

在FPS游戏上的方框绘制并非真正是在程序窗口上绘制,实际上是找到敌人在游戏中的坐标x,y,z,找到自己在游戏中的坐标x,y,z,结合通过分析象限角度和FOV视角计算出人物在我方屏幕上的坐标,然后通过程序在屏幕上根据得出的坐标绘制方框。

目的

本篇文章不会讲解3D游戏中的绘制,只讲解如何通过Python在屏幕上绘制方框,因为网上对Python在这方面的教程实在太少了,几乎无,看完此文章,你也可以学到一些WindowsAPI函数,这里我们以CE自带教程的第二关为例绘制方框。

正文

分析

如下图,我们要通过Python在健康值上绘制方框,并能使方框跟随目标移动,FPS中是通过一系列计算获取到坐标绘制,这里我们为演示绘制,简单的通过窗口子句柄获取到其在屏幕上的坐标,绘制原理是一样的,只是坐标寻找不同。

所需库引入

python">import ctypes
import win32gui, win32api
from pywinauto.win32functions import *
from pywinauto.win32structures import RECT

第一步:获取健康值的窗口句柄

健康值也是一个窗口,是步骤2这个大窗口的子窗口,他也有自己的句柄。

方式一:

直接通过Spy++获取到健康值的句柄,然后定义变量保存即可。注意!!窗口每次打开其窗口句柄是会变化的,请勿直接复制粘贴。

python">healthHandle=0x00070406

方式二:

通过父窗口的标题和类名找到健康值这个子窗口的句柄。这样就可以避免第一种方式带来的问题。

语句解释:先通过Spy++查询到步骤2的窗口标题是"步骤 2"(注意有1个空格),类名是"Window"(可以填None),然后获取到父窗口句柄。再定义一个存放子窗口句柄的列表,然后通过父窗口句柄将其所有子窗口句柄作为参数追加到列表中,

python">WindowHandle=win32gui.FindWindow("Window","步骤 2")
childrenWindowHandle=[]
win32gui.EnumChildWindows(WindowHandle,lambda hwnd,param: param.append(hwnd),childrenWindowHandle)

然后,定义一个变量用于存放健康值的句柄,从众多的字句柄中同样根据健康值窗口标题和类名将其取出。

python">healthHandle=None
for obj in childrenWindowHandle:if win32gui.GetWindowText(obj)=="" and win32gui.GetClassName(obj)=="Window":healthHandle=int(obj)

第二步:绘制所需相关对象准备

既然是绘制,那么绘制就需要画刷(Brush),还需要一个用于绘制的板子,这里我们绘制的板子就是整个屏幕,屏幕我们称之为设备上下文(DeviceContext),简称DC,绘制在哪呢,当然是健康值这个句柄的边界(Rect) ,定义对象如下:

语句解释:

第一句通过win32gui获取到设备上下文,传入0表示整个屏幕

第二步定义了一个边界结构体Rect,用于存放后续获取到的健康值句柄边界

第三步我们定义了一个画刷,红色的

有了如下工具,就可以开始循环绘制以实现方框跟随目标的移动

python">dc = win32gui.GetDC(0)
rect=RECT()
brush=win32gui.CreateSolidBrush(win32api.RGB(255, 0, 0))

第三步:循环绘制

语句解释:

GetWindowRect表示获取一个句柄在相对于整个屏幕的坐标信息,此句一执行,rect对象将会存放句柄相对于整个屏幕的坐标信息,其中left表示健康值句柄左上角点相对于屏幕左边像素点大小,top表示左上角点相对于整个屏幕顶部的像素点大小,right表示右下角点相对于整个屏幕左边的像素点大小,bottom表示右下角点相对于整个屏幕顶部的像素点大小。

FrameRect表示在整个屏幕用画刷在传入的位置进行绘制,至此绘制功能实现。

python">while True:GetWindowRect(healthHandle, rect)l=rect.leftt=rect.topr=rect.rightb=rect.bottomwin32gui.FrameRect(dc,(l, t, r, b),brush)

结果:

拖动窗口可以看见,所绘制的方框跟随着目标移动。(这里由于GIF录制,表现出闪烁严重)

社群分享:

加入Q群:307531422   ,一起学习不一样的技术


http://www.ppmy.cn/embedded/103858.html

相关文章

python基础(14内置函数介绍)

python系列文章目录 python基础(01变量&数据类型&运算符) python基础(02序列共性) python基础(03列表和元组) python基础(04字符串&字典) python基础(05集合set) pytho…

天宝TBCTrimble Business Center中文版本下载安装使用介绍

天宝TBC:测绘之道,尽在其中 引言 昔日杜甫,忧国忧民,今朝我辈,测绘天下。天宝TBC,乃测绘之利器,助我等行走于山川河流之间,绘制天地之图。此文将以杜甫之笔,述说TBC之妙…

JVM面试(一)什么是虚拟机?什么是class文件?

什么是java虚拟机? 如果通俗点来讲,我们在电脑上一行行敲出来的代码,电脑本身是不认识的,最终是要转成电脑可以运行的101001这种字节。 但是这些我们又不可能手动来转换,所以呢,就需要一个工具&#xff0…

第十五章 rust中进行windows系统开发

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中进行Windows系统开发 目录 注意一、前言二、指针三、windows四、字符串一、前言 作为系统级语言,rust可以很容易的和C++一样进行系统级编程,但实际操作后我相信你会遇到相当多的问题。 比如以本文要介绍的…

vue3手动写一个图片懒加载的插件

关于图片懒加载,网上自然是有许多形形色色的成品的,但是现在我们自己来实现一个图片懒加载的功能 实现原理: 主要利用了js提供的一个新方法,IntersectionObserver用于监听元素是否在页面可视区域, 用法: C…

HTTP 缓存

一、概述 1.HTTP缓存的基本原理是将Web资源(如HTML,CSS,JavaScript,图片等)保存在客户端或中间代理服务器上,后续的请求可以直接使用客户端或代理服务器上缓存的资源,而不必重新从服务器上获取。 2.HTTP缓存分为强制…

CSS\JS实现页面背景气泡logo上浮效果

效果图&#xff1a; 单容器显示气泡&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Bu…

深入详解 C# Task.Run异步任务

目录 Task.Run Task.Run 的底层原理 默认并发数量 控制并发 使用 SemaphoreSlim 代码解析 使用 Parallel.ForEach 代码解析 注意事项 自定义任务调度器 代码解析 使用自定义任务调度器&#xff1a; 总结 Task.Run Task.Run 是 .NET 中创建和启动异步任务的一种便…